Я пытаюсь поместить информацию из файла .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
В вашем файле между записями есть пустая строка? Ты, кажется, не справляешься с этим. Во второй записи все будет ошибкой на единицу, а
E002
не является числом с плавающей запятой.Какая строка передается
stof
при возникновении исключения? Вы можете свести программу к простому вызовуstof
с этой строкой, но есть большая вероятность, что к тому времени вы решите проблему.@RetiredNinja да, между записями есть одна строка, поэтому, скажем, у меня есть E001 - E010. У меня есть 9 строк между записями для последней записи, скажем, в этом случае E010, у меня есть 2 пустые строки со 2-й до последней пустой строки, затем последняя пустая строка.
Я бы добавил
if (line.empty()) { continue; }
передswitch
.Помимо проверки пустой строки, нам все еще нужно перехватывать здесь исключения для обработки входных строк неправильного формата.
@chris Я сделал то, что вы сказали, и вы были правы, в одной из записей не хватало одной строки информации, и это отбрасывало остальную часть файла .txt. Теперь работает спасибо!