2012-12-13 3 views
0

Программа, которую я пишу, должна предполагать перечислить весь платеж, сделанный каждым студентом, показать сумму, уплаченную и невыплаченную.Программа на 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

Помогите объяснить, почему это делается, пожалуйста? Спасибо

+1

остальные Простое исправление было бы поставить 'infile.ignore (станд :: numeric_limits <станд :: streamsize> :: макс(), '\ п');' внутри цикла while. – jrok

+0

@jrok Вы должны объяснить, почему это работает. –

+1

Некоторые строки в вашем файле содержат данные, которые вы, очевидно, не хотите читать. Это не будет автоматически устраняться с вашего пути, поэтому: оператор в моем предыдущем комментарии говорит потоку игнорировать все до максимального размера потока или первого нового символа линии - в зависимости от того, что он встречает первым. @DavidHeffernan предоставляет альтернативный подход в своем ответе (лучше, поскольку легче проверить и обработать возможные erros, IMO). – jrok

ответ

2

Ключевой раздел кода находится здесь.

while (infile >> StudentCode >> Amount) 
{ 
    amountsPaid[StudentCode] += Amount; 
} 

Эта петля вытягивает пары чисел. Эти пары, которые получают стянули поток:

 
11 50 
12 25 
4543 2323 
2321 12 

В этот момент текст Barclays встречается и поэтому цикл, пока заканчивается. Это связано с тем, что текст не может быть преобразован в float.

Чтобы решить вашу проблему, вам необходимо переключиться на обработку, ориентированную на линию. Используйте getline(), чтобы снять линию за раз. А затем разделите строку на отдельные элементы. Одно из возможных решений будет выглядеть примерно так:

string line; 
while (getline(infile, line)) 
{ 
    istringstream strm(line); 
    strm >> StudentCode >> Amount; 
    amountsPaid[StudentCode] += Amount; 
} 
1

Что файл содержит на самом деле больше, чем две колонки, и вы читаете только две колонки, так что следующий входной_файл >> StudentCode >> Сумма прочтет тип оплата как StudentCode. Вы должны сделать только два столбца в своем файле или отбросить дополнительные столбцы до конца строки, прежде чем читать следующую комбинацию «StudentCode >> Amount», например.
в то время (входной_файл >> StudentCode >> Сумма)
{
        amountsPaid [StudentCode] + = сумма;
        infile.getline (buff, size); // это будет читаться строка
}

Смежные вопросы