我给出了一个答案,我想每次通过循环检查流的有效性here https://stackoverflow.com/a/28277950/2642059.
我原来使用的代码good
看起来类似于:
ifstream foo("foo.txt");
while (foo.good()){
string bar;
getline(foo, bar);
cout << bar << endl;
}
我立即被指出here https://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong并被告知永远不要测试good
。显然这是我不明白的事情,但我想正确地执行我的文件 I/O。
我用几个例子测试了我的代码,但无法使good
-测试代码失败。
首先(打印正确,以新行结尾):
bleck 1
布莱 1 2
blah
以新行结束
第二(打印正确,以最后一行结束):
bleck 1
布莱 1 2
blah
这不会以新行结束
第三个是一个空文件(打印正确,只有一个换行符。)
第四个是丢失的文件(这正确地没有打印任何内容。)
有人可以帮我举一个例子来证明why good
- 不应该进行测试吗?
他们错了。口头禅是“永远不要测试”.eof()
'.
- 为什么循环条件内的 iostream::eof 被认为是错误的? https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong?s=1%7C5.4841
即使这个咒语也太过分了,因为两者都有助于在提取失败后诊断流的状态。
所以咒语应该更像是
不要使用good()
or eof()
在尝试进一步阅读之前检测 eof
同样适用于fail()
, and bad()
当然stream.good
可以在使用流之前有效地使用(例如,如果流是尚未成功打开的文件流)
然而,两者都非常非常经常abused检测输入的结束,但这不是它的工作原理。
为什么不应该使用此方法的典型示例:
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";
}
Prints
false
true
See it 住在科里鲁 http://coliru.stacked-crooked.com/a/e2eef88fdd223a37
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)