Terminate вызывается после создания экземпляра 'std::invalid_argument' what(): stof. Ввод из файла .txt

avatar
Austin Gyan Marbella
9 августа 2021 в 04:27
230
0
0

Я пытаюсь поместить информацию из файла .txt в связанный список. Поскольку некоторые из них представляют собой денежные значения, такие как GrossPay и NetPay, мне нужно преобразовать их из строки в число с плавающей запятой. Однако моя программа не запустится, так как обнаружит ошибку std::invalid аргумента и не примет значения и не преобразует их.


    //Variable Declarations
    std::string line;
    std::ifstream myfile("C:\\Users\\marbe\\Desktop\\FINALS 1ST YEAR S.Y. 2019 - 2020\\PayrollRecords.txt");


    //while file is open, traverse by line
    if (myfile.is_open())
    {
        int count = 0;
        while ( std::getline (myfile,line) )
        {
        //count determines which line getfile is at the current node
        switch(count)
        {
            case 0:
                pnode.emp_num = line;
            break;

            case 1:
                pnode.rateperd = stof(line);
            break;

            case 2:
                pnode.rateperh = stof(line);
            break;
            
            case 3:
                pnode.otrate = stof(line);
            break;
            
            case 4:
                pnode.pr_date = line;
            break;

            case 5:
                pnode.grosspay = stof(line);
            break;

            case 6:
                pnode.socialsecurity = stof(line);
            break;

            case 7:
                pnode.homefund = stof(line);
            break;

            case 8:
                pnode.incometax = stof(line);
            break;

            case 9:
                pnode.totaldeductions = stof(line);
            break;

            case 10:
                pnode.netpay = stof(line);
            break;
        }

        //if within the bounds of the node, continue adding
        if(count < 11)
        {
            count++;
        }

        //once reached the end of the node, reset count to 0 and push node into list
        else
        {
            count = 0;
            PayrollRecords.push_back(pnode);
            payempcount++;
        }

        }
        myfile.close();
    }

    else std::cout << "Unable to open file" << std::endl;

Вот пример того, что содержит файл .txt

E001
1000,00
125,00
500,00
30.01.2021
32250,00
4837,50
645,00
6450,00
11932,50
20317.50

E002
1500,00
187,50
500,00
28.02.2021
47250,00
7087,50
945,00
9450,00
17482,50
29767,50

Источник
Retired Ninja
9 августа 2021 в 04:38
2

В вашем файле между записями есть пустая строка? Ты, кажется, не справляешься с этим. Во второй записи все будет ошибкой на единицу, а E002 не является числом с плавающей запятой.

chris
9 августа 2021 в 04:57
0

Какая строка передается stof при возникновении исключения? Вы можете свести программу к простому вызову stof с этой строкой, но есть большая вероятность, что к тому времени вы решите проблему.

Austin Gyan Marbella
9 августа 2021 в 05:58
0

@RetiredNinja да, между записями есть одна строка, поэтому, скажем, у меня есть E001 - E010. У меня есть 9 строк между записями для последней записи, скажем, в этом случае E010, у меня есть 2 пустые строки со 2-й до последней пустой строки, затем последняя пустая строка.

Retired Ninja
9 августа 2021 в 06:10
0

Я бы добавил if (line.empty()) { continue; } перед switch.

prehistoricpenguin
9 августа 2021 в 06:11
0

Помимо проверки пустой строки, нам все еще нужно перехватывать здесь исключения для обработки входных строк неправильного формата.

Austin Gyan Marbella
9 августа 2021 в 06:30
0

@chris Я сделал то, что вы сказали, и вы были правы, в одной из записей не хватало одной строки информации, и это отбрасывало остальную часть файла .txt. Теперь работает спасибо!

Ответы (0)