从文本文件中读取,直到EOF重复上一行?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (15)

以下C ++代码使用ifstream对象从文本文件(每行有一个数字)读取整数,直到它遇到EOF。为什么它读取最后一行的整数两次?如何解决这个问题?

码:

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ifstream iFile("input.txt");    // input.txt has integers, one per line

    while (!iFile.eof())
    {
        int x;
        iFile >> x;
        cerr << x << endl;
    }

    return 0;
}

input.txt

10  
20  
30

输出

10  
20  
30  
30

注意:我跳过了所有的错误检查代码,以保持代码片段的小。上述行为可以在Windows(Visual C ++),cygwin(gcc)和Linux(gcc)上看到。

提问于
用户回答回答于

只需密切关注事件链。

  • 抓住10
  • 抓住20
  • 抓住30
  • 抓住EOF

看看倒数第二个迭代。你抓住了30,然后继续检查EOF。您尚未到达EOF,因为EOF标记尚未读取(“二进制”说,其概念位置在30行之后)。因此,您继续进行下一次迭代。从前面的迭代中x仍然是30。现在你从流中读取并获得EOF。x保持30,并且ios :: eofbit被提升。你输出到stderr x(这是30,就像在前面的迭代中一样)。接下来在循环条件中检查EOF,这次你不在循环中。

尝试这个:

while (true) {
    int x;
    iFile >> x;
    if( iFile.eof() ) break;
    cerr << x << endl;
}

顺便说一句,你的代码中有另一个错误。你有没有尝试在空文件上运行它?你得到的行为是出于完全相同的原因。

用户回答回答于

我喜欢这个例子,现在,它留下了你可以在while块中添加的支票:

ifstream iFile("input.txt");        // input.txt has integers, one per line
int x;

while (iFile >> x) 
{
    cerr << x << endl;
}

扫码关注云+社区