我正在尝试从文件中读取,并且我已将它们分隔为新的行字符。我正在使用这些代码:
fstream input("wordfile.dat", ios::in);
char b[10];
while (!input.eof())
{
input.getline(b, 10);
cout << b << endl;
}
如果我将while语句从while(!input.eof())更改为while(输入),程序将在循环结束前输出一个空行。但现在不会。问题是,在两个语句中,while条件必须首先输入一行,并通过输入它,它将知道它是否已到达文件末尾或是否还有更多信息。因此input.eof()必须像其他语句一样运行并输出一个空行。首先我认为这是一个错误,但我想知道它为什么表现正确。这两个条件有什么区别?
答案 0 :(得分:0)
我们看到operator bool
......
请注意,此函数与成员
的返回值不同good
[...]
... if (stream)
不与if (stream.good())
相同,但也了解它......
返回是否设置了错误标志(
failbit
或badbit
)。
所以它与not stream.fail()
基本相同(如果设置了true
或failbit
,则为badbit
)。
这也解释了while (stream)
和while (not stream.eof())
之间的不同行为:
当输入文件没有以换行结束时,stream.getline(buffer, size)
将在到达分隔换行符(或10个字符限制)之前遇到文件结尾,从而设置eofbit
。然后,使用operator bool
对流进行测试仍然是正确的(因为failbit
和badbit
都未设置),并且只有在尝试使用getline
进行更多阅读后才会设置{ {1}}因为没有提取任何字符。
但是在使用failbit
进行测试时,仅not stream.eof()
将结束循环。
如果流是eofbit
,就是您要测试的,
good
然后,这意味着该流既不在文件末尾(if (stream) // ...
),也不在eof
或bad
ed。
所以当它不在文件末尾时,它仍然可能失败或处于不良状态。
请参阅the table here。
阅读(或写入)流时,请测试fail
,除非您有特殊原因不这样做。
作为旁注,当您执行如下输入时会发生这种情况,因为good
会返回对其调用的实例的引用:
getline