.eof()循环不起作用

Sea*_*ean 2 c++ loops while-loop

我正在尝试从文件中读取数字并将它们放入数组中.现在,当我运行该程序时,它打印8个数字,然后该行结束并打印相同的8个数字.这是一个永无止境的循环.我究竟做错了什么?

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

int main()                                                                      
{                                                                               
  int num;                                                                      
  ifstream infile;                                                              
  infile.open("euler8Nums.txt");                                                
    infile >> num;//must attempt to read info prior to an eof() test            
    while(!infile.eof()){                                                       
      cout << num << endl;                                                      
      infile >> num;                                                            
    }                                                                           
    infile.close();                                                             
    return 0;                                                                   
}  
Run Code Online (Sandbox Code Playgroud)

Moo*_*uck 11

一般情况下,请勿使用.eof().bad().只需检查流本身的状态

while (infile >> num)
    cout << num << endl;
Run Code Online (Sandbox Code Playgroud)

如果流无法解析输入,则不会设置eof标志,然后流将停止运行,直到状态被清除.如果你检查过bad它,它将一直运行直到它无法解析,但会在EOF中出错.因此,只需检查流是否仍然是.good()(当它在while循环中时是隐式的).

在你的情况下,它是一个无限循环,因为文件没有打开,然后你试图读取数字,但读取没有任何作用,因为文件没有打开.因此它永远不会读取eof,因此无限循环.


Die*_*ühl 5

我不知道你的文件包含什么或者它如何导致无限循环打印超过最后一个数字。但是,该eof()位仅适用于错误报告,但not适用于循环控制。此外,代码中还有很多其他的东西是完全没有必要的。以下程序应该可以正确读取数字:

#include <iostream>                                                             
#include <fstream>                                                              

int main()                                                                      
{                                                                               
    std::ifstream infile("euler8Nums.txt");
    for (int num; infile >> num; )
        std::cout << num << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我从来没有看到open()单独调用的意义,除非在计算文件名之前有必要的条件。同样,close()除非您想检查关闭是否成功(尽管我不确定close()输入流是否有机会失败),否则显式调用似乎毫无意义。

我的另一个烦恼是不必要地使用std::endl:这个操纵器是性能不佳的一个相对频繁的来源!它做两件事:

  1. 它写一个行尾字符,即\n(或者,在宽字符流上加宽这个字符的结果)。
  2. 它冲洗流。在文件流上,这是一项相当昂贵的操作,很容易减慢速度,这是一个重要因素(不仅仅是几个百分点)。实际写入通常支配将数据写入文件的代码的实际实时性能。

仅在您真正想要的时候刷新流。如果你觉得你的流需要额外的刷新,例如当试图找到崩溃前写入的内容时,只需std::unitbuf在流对象上设置:从性能的角度来看这会更糟,因为它在每次插入后刷新流但是一旦找到问题,就很容易将其删除。

当然,生成的程序可以更改为更简洁的内容,例如

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>

int main()
{
    std::copy(std::istream_iterator<int>(std::ifstream("euler8Nums.txt") >> std::ws),
              std::istream_iterator<int>(), std::ostream_iterator<int>(std::cout, "\n"));
}
Run Code Online (Sandbox Code Playgroud)