2012-01-04 138 views
2

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

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

可能重复的整洁://计算器。com/questions/6512173/ifstream-not-reading-eof-character) – 2012-01-04 21:21:30

回答

11

一般情况下,请勿使用.eof().bad()。只是检查本身

while (infile >> num) 
    cout << num << endl; 

的EOF标志不会被置流的状态,如果流无法解析的输入,然后流将停止工作,直到状态被清除。如果您选中了bad,它会一直运行,直到它解析失败,但会在EOF中出错。所以只要检查流是否仍然是.good()(当它在while循环中时是隐含的)。

在你的情况,这是一个无限循环,因为文件没开然后你尝试读取数据,但阅读是做什么都不因为文件未打开。因此它从不读取eof,因此无限循环。

+0

试图改变,现在没有打印 – Sean 2012-01-04 21:23:39

+0

@ Sean:对,因为它没有阅读。您的代码也无法阅读,但您不知道。你的文件(A)没有打开,或者(B)里面没有'int'。可能没有打开。 – 2012-01-04 21:31:03

+0

请注意,您可以使用'is_open()'来检查文件是否成功打开。你也可以使用'good()'来确保'eof','failbit'和'badbit'都没有被设置。 – prelic 2012-01-04 21:35:20

4

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

#include <iostream>                
#include <fstream>                

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

我从来没有单独调用open()除非是有必要条件之前必须在文件名可以算出看到了点。同样,明确地调用close()似乎是非常没有意义的,除非您想检查关闭是否成功(尽管我不确定输入流上的close()是否有机会失败)。

另一个我的宠物狗是不必要的使用std::endl:这个操纵者是一个相对频繁的不良表现的来源!它有两件事:

  1. 它写行尾字符,即\n(或在宽字符流上扩大此字符的结果)。
  2. 它刷新流。在文件流这是一个相当昂贵的操作,可以很容易地减慢是一个实质性的因素(不只是百分之几)。实际的写操作往往支配将数据写入文件的代码的实际实时性能。

只有在您真正意图到的时候才会刷新流。如果您觉得自己需要额外的流式冲洗功能,例如当试图找到崩溃前正确写入的内容时,只需在流对象上设置std::unitbuf:从性能的角度来看,这会更糟糕,因为每次插入后都会刷新流,但一旦找到问题,就可以轻松地将其删除。

当然,所得到的程序可被改变的东西甚至像的[ifstream的不读EOF字符](HTTP

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