c – 为什么流:: good是错的示例?

我给出了一个答案,我希望每次通过循环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() or eof() 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

见它Live On Coliru

上一篇:CodeGo.net>一个人如何使用FileStream追加到文件而没有排他锁?


下一篇:使用php加载并读取csv文件