我给出了一个答案,我希望每次通过循环here检查流的有效性.
我的原始代码使用良好,看起来与此类似:
ifstream foo("foo.txt");
while (foo.good()){
string bar;
getline(foo, bar);
cout << bar << endl;
}
我立刻被指出here并被告知永远不会测试好.显然,这是我无法理解的,但我想正确地进行文件I / O.
我用几个例子测试了我的代码,无法使良好的测试代码失败.
首先(这打印正确,以新行结束):
bleck 1
blee 1 2
blah
ends in new line
第二个(正确打印,以最后一行结束):
bleck 1
blee 1 2
blah
this doesn’t end in a new line
第三个是一个空文件(正确打印,一个换行符.)
第四个是丢失的文件(这没有正确打印.)
有人可以用一个例子来帮助我,说明为什么不应该进行良好的测试?
解决方法:
他们错了.口头禅是’永远不会测试.eof()’.
> Why is iostream::eof inside a loop condition considered wrong?
甚至那个咒语也是过分的,因为两者都有助于在提取失败后诊断流的状态.
所以咒语应该更像
Don’t use
good()
oreof()
to detect eof before you try to read any further
对于fail()和bad()也是如此
当然,在使用流之前可以有效地使用stream.good(例如,如果流是尚未成功打开的文件流)
然而,两者都非常经常被滥用以检测输入的结束,而这不是它的工作方式.
一个典型的例子,说明为什么你不应该使用这个方法:
std::istringstream stream("a");
char ch;
if (stream >> ch) {
std::cout << "At eof? " << std::boolalpha << stream.eof() << "\n";
std::cout << "good? " << std::boolalpha << stream.good() << "\n";
}
打印
false
true