Программа, которую я пишу, должна предполагать перечислить весь платеж, сделанный каждым студентом, показать сумму, уплаченную и невыплаченную.Программа на C++ не отображает содержимое из текстового файла правильно
Однако проблема в том, что она не отображается правильно по какой-либо причине, которую я не могу найти.
Содержание payment.txt файла в следующем порядке: Student Код Сумма Тип (пустой означает наличные)
11 50
12 25 4543 2323 2321
12 25 Barclays
13 100
14 100
15 50 4545 6343 4342
15 25 HSBC
16 100
17 100
18 100
19 100
20 25 4546 3432 3211
21 75
22 100 Lloyds
23 100
Здесь есть код до сих пор:
void payment()
{
// Display message asking for the user input
std::cout << "\nList all payment made by each student, show amount paid and outstanding." << std::endl;
// Read from text file and Display list of payment
std::ifstream infile; // enable to open, read in and close a text file
float StudentCode; // to store the student enrolment number
float Amount; // to store the amount of money
float Type; // to store information on type of payment made
float Outstanding; // to store amount of money is due
std::map<int, float> amountsPaid;
infile.open("Payment.txt"); // open a text file called Payment
if (!infile)
{
std::cout << "List is empty" << std::endl; // if the file is empty it output the message
}
else
{
// Display Headings and sub-headings
std::cout << "\nList of Payment: " << std::endl;
std::cout << "" << std::endl;
std::cout << "Enrolment No." << " " << "Amount" << " " << "Outstanding" << std::endl;
// accumulate amounts
while (infile >> StudentCode >> Amount)
{
amountsPaid[StudentCode] += Amount;
}
// loop through map and print all entries
for (auto i = amountsPaid.begin(); i != amountsPaid.end(); ++i)
{
float outstanding = 100 - i->second;
// Display the list of payment made by each student
std::cout << i->first << " " << i->second << " " << "$: " << outstanding << '\n' << std::endl;
}
}
infile.close(); // close the text file
}
Это отображения после этого, когда он запускается:
11 50 $ 50 12 25 $ 75 2321 12 $ 88 454 3 2323 $ -2223
Помогите объяснить, почему это делается, пожалуйста? Спасибо
остальные Простое исправление было бы поставить 'infile.ignore (станд :: numeric_limits <станд :: streamsize> :: макс(), '\ п');' внутри цикла while. – jrok
@jrok Вы должны объяснить, почему это работает. –
Некоторые строки в вашем файле содержат данные, которые вы, очевидно, не хотите читать. Это не будет автоматически устраняться с вашего пути, поэтому: оператор в моем предыдущем комментарии говорит потоку игнорировать все до максимального размера потока или первого нового символа линии - в зависимости от того, что он встречает первым. @DavidHeffernan предоставляет альтернативный подход в своем ответе (лучше, поскольку легче проверить и обработать возможные erros, IMO). – jrok