为什么流:: good是错的?

Jon*_*Mee 12 c++ file-io stream filestream

我把我想通过一个循环,每次检查流的有效性的答案在这里.

我使用的原始代码good与此类似:

ifstream foo("foo.txt");

while (foo.good()){
    string bar;
    getline(foo, bar);
    cout << bar << endl;
}
Run Code Online (Sandbox Code Playgroud)

我立刻指着这里告诉我永远不要测试good.显然,这是我无法理解的,但我想正确地进行文件I/O.

我用几个例子测试了我的代码,但无法使测试good代码失败.

首先(这打印正确,以新行结束):

bleck 1 blee 1
2
blah
以新行结束

第二个(正确打印,以最后一行结束):

bleck 1 blee 1
2
blah
这不会以新的一行结束

第三个是一个空文件(正确打印,一个换行符.)

第四个是丢失的文件(这没有正确打印.)

有人可以用一个例子来帮助我,说明为什么 good不应该做测试?

seh*_*ehe 6

他们错了.口头禅是"永不测试.eof()".

甚至那个咒语也是过分的,因为两者都有助于在提取失败后诊断流的状态.

所以咒语应该更像

在尝试进一步阅读之前,请勿使用good()eof()检测eof

同样的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";
}
Run Code Online (Sandbox Code Playgroud)

打印

false
true
Run Code Online (Sandbox Code Playgroud)

看到Live On Coliru