0

私が書いているプログラムは、各学生によって行われたすべての支払いをリストし、支払われた金額と未払い額を表示することを想定しています。

しかし、問題は、私が見つけられないような何らかの理由で正しく表示されないことです。

次の順序でのpayment.txtファイルの内容:学生コード金額タイプ(空白は現金を意味します)

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 4543 2323 $ -2223

なぜこれを行うのか説明していただけますか?ありがとう

4

2 に答える 2

2

コードの重要なセクションはここにあります。

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

このループは、数値のペアをプルします。これらは、ストリームから引き離されるペアです。

11 50
12 25
4543 2323
2321 12

その時点でテキストBarclaysが検出されるため、whileループは終了します。これは、テキストをに変換できないためfloatです。

問題を解決するには、行指向の処理に切り替える必要があります。getline()一度に線を引くために使用します。そして、ラインを個別のアイテムに分割します。考えられる解決策の1つは、次のようになります。

string line;
while (getline(infile, line))
{
    istringstream strm(line);
    strm >> StudentCode >> Amount;
    amountsPaid[StudentCode] += Amount;
}
于 2012-12-13T20:41:02.033 に答える
1

ファイルに含まれるのは実際には3列以上で、2列しか読み取っていないため、次のinfile >> StudentCode>>Amountは支払いの種類をStudentCodeとして読み取ります。次の「StudentCode>>Amount」の組み合わせを読み取る前に、ファイルに2つの列のみを作成するか、行末までさらに列を破棄する必要があります。たとえば
、while(infile >> StudentCode >> Amount)
{
    amountsPaid [StudentCode] + = Amount;
    infile.getline(buff、size); //残りの行を読み取ります
}

于 2012-12-13T20:43:05.370 に答える