猿问

从文本文件中读取,直到EOF重复最后一行

从文本文件中读取,直到EOF重复最后一行

以下内容C+代码使用如果流对象从文本文件(每一行有一个数字)中读取整数,直到它命中。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;}

输入txt:

10  20  30

输出量:

10  20  30  30

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


Helenr
浏览 675回答 3
3回答

慕仙森

只要紧跟着一连串的事件就行了。抓10抓20抓取30抓斗EOF看看第二次到最后一次迭代。你抓了30,然后继续检查EOF。您还没有到达EOF,因为EOF标记还没有被读取(“二进制”而言,它的概念位置就在30行之后)。因此,您将继续进行下一次迭代。与以前的迭代相比,X仍然是30。现在你从溪流中读到,你得到了EOF。X保持为30,而IOS:eofbit被引发。您将输出到stderrx(与上一次迭代一样,这是30)。接下来,在循环条件下检查EOF,这次是退出循环。试试这个:while&nbsp;(true)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;iFile&nbsp;>>&nbsp;x; &nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;iFile.eof()&nbsp;)&nbsp;break; &nbsp;&nbsp;&nbsp;&nbsp;cerr&nbsp;<<&nbsp;x&nbsp;<<&nbsp;endl;}顺便说一下,您的代码中还有另一个bug。你试过在一个空文件上运行它吗?你所得到的行为也是出于同样的原因。

POPMUISE

我喜欢这个示例,它现在省略了可以在while块中添加的检查:ifstream&nbsp;iFile("input.txt");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;input.txt&nbsp;has&nbsp;integers,&nbsp;one&nbsp;per&nbsp;lineint&nbsp;x;while&nbsp;(iFile&nbsp;>>&nbsp;x)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;cerr&nbsp;<<&nbsp;x&nbsp;<<&nbsp;endl;}不确定它有多安全.。

慕码人2483693

有另一种方法可以解决这个问题:#include&nbsp;<iterator>#include&nbsp;<algorithm>//&nbsp;... &nbsp;&nbsp;&nbsp;&nbsp;copy(istream_iterator<int>(iFile),&nbsp;istream_iterator<int>(), &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ostream_iterator<int>(cerr,&nbsp;"\n"));
随时随地看视频慕课网APP
我要回答