为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
Helenr 2019-06-21 15:12:44
从文本文件中读取,直到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)上都可以看到上述行为。
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

只要紧跟着一连串的事件就行了。

  • 抓10
  • 抓20
  • 抓取30
  • 抓斗EOF

看看第二次到最后一次迭代。你抓了30,然后继续检查EOF。您还没有到达EOF,因为EOF标记还没有被读取(“二进制”而言,它的概念位置就在30行之后)。因此,您将继续进行下一次迭代。与以前的迭代相比,X仍然是30。现在你从溪流中读到,你得到了EOF。X保持为30,而IOS:eofbit被引发。您将输出到stderrx(与上一次迭代一样,这是30)。接下来,在循环条件下检查EOF,这次是退出循环。

试试这个:

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

顺便说一下,您的代码中还有另一个bug。你试过在一个空文件上运行它吗?你所得到的行为也是出于同样的原因。


查看完整回答
反对 回复 2019-06-21
?
POPMUISE

TA贡献1765条经验 获得超5个赞

我喜欢这个示例,它现在省略了可以在while块中添加的检查:

ifstream iFile("input.txt");        // input.txt has integers, one per lineint x;while (iFile >> x) {
    cerr << x << endl;}

不确定它有多安全.。


查看完整回答
反对 回复 2019-06-21
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

有另一种方法可以解决这个问题:

#include <iterator>#include <algorithm>// ...

    copy(istream_iterator<int>(iFile), istream_iterator<int>(),
         ostream_iterator<int>(cerr, "\n"));


查看完整回答
反对 回复 2019-06-21
  • 3 回答
  • 0 关注
  • 674 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信