C++ 程序无法正确显示文本文件中的内容

标签 c++ visual-studio-2010 visual-c++

我正在编写的程序是假设列出每个学生支付的所有款项,显示已支付和未支付的金额。

但是问题是由于某些我似乎无法找到的原因它无法正确显示。

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

您能帮忙解释一下为什么要这样做吗? 谢谢

最佳答案

代码的关键部分在这里。

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

这个循环拉取成对的数字。这些是从流中删除的对:

11   50
12   25 
4543 2323 
2321 12

At that point the text Barclays is encountered and so the while loop terminates. That is because the text cannot be converted into a float.

To solve your problem you will need to switch to line oriented processing. Use getline() to pull off a line at a time. And then break the line into distinct items. One possible solution would be like so:

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

关于C++ 程序无法正确显示文本文件中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13867895/

相关文章:

python - 编译Cython代码时出现"error: Unable to find vcvarsall.bat"

visual-c++ - 64 位指针减法、有符号整数下溢和可能的编译器错误?

c++ - 在 VC6 中使用 VS 2005 库时出现编译错误

在堆栈上分配对象时的 C++ 继承错误

c# - Visual Studio 调试很慢

c++ - 用户输入字符串的验证器

visual-studio-2010 - Visual Studio 附加组件和扩展性能监控?

CreateFile 总是覆盖指定的文件

c++ - 如何在 LLVM 中找到操作数的定义点?

c++ - std::vector 比普通数组快多少?