我正试着从一个文件中读入数字并把它们放入一个数组中。现在,当我运行程序时,它会打印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;
}
3条答案
按热度按时间cotxawn71#
一般情况下,不要使用
.eof()
或.bad()
。只需检查流本身的状态如果流未能解析输入,则不会设置eof标志,然后流将停止操作,直到状态被清除。如果你检查
bad
,它会一直运行到解析失败,但会在解析失败时出错。因此,只需检查流是否仍然是.good()
(当它处于while循环中时,这是隐式的)。在你的例子中,这是一个无限循环,因为文件 * 没有打开 *,然后你试图读取数字,但是阅读没有做任何事情 *,因为文件没有打开。因此,它永远不会读取
eof
,因此无限循环。eoxn13cs2#
我不知道你的文件包含什么,也不知道它是如何导致无限循环打印比最后一个数字多的。但是,
eof()
位仅适用于错误报告,而not
位适用于环路控制。此外,代码中还有很多其他的东西是完全不必要的。下面的程序应该可以读取数字:我从来不认为单独调用
open()
有什么意义,除非在确定文件名之前有一个必要的条件。类似地,显式调用close()
似乎毫无意义,除非您想检查关闭是否成功(尽管我不确定输入流上的close()
是否有机会失败)。我的另一个讨厌的事情是不必要地使用
std::endl
:这种操纵器是一个相对频繁的不良性能的来源!它做两件事:1.它写一个行尾字符,即。
\n
(或者,在宽字符流上,是加宽此字符的结果)。1.它能冲垮小溪。在文件流上,这是一个相当昂贵的操作,很容易会降低速度(不仅仅是几个百分点)。实际的写操作通常会影响将数据写入文件的代码的实际实时性能。
只有当你真的想冲的时候才冲。如果你觉得你需要额外的冲洗你的流,例如。当试图查找崩溃前写的内容时,只需在stream对象上设置
std::unitbuf
:从性能的观点来看,这将是更差的,因为它在每次插入之后刷新流,但是一旦问题被定位,它就容易被移除。当然,生成的程序可以更改为更简洁的程序,例如
ubof19bj3#
include #包含