从文本文件读取直到 EOF 重复最后一行[重复]

2024-03-24

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

Code:

#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;
}

输入.txt:

10  
20  
30

Output:

10  
20  
30  
30

Note:我跳过了所有错误检查代码以保持代码片段较小。上述行为出现在 Windows (Visual C++)、cygwin (gcc) 和 Linux (gcc) 上。


只需密切关注事件链即可。

  • Grab 10
  • Grab 20
  • Grab 30
  • Grab 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;
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从文本文件读取直到 EOF 重复最后一行[重复] 的相关文章

随机推荐