gpt4 book ai didi

c++ - 为什么 stream::good 是错误的示例?

转载 作者:IT老高 更新时间:2023-10-28 23:18:44 29 4
gpt4 key购买 nike

我给出了一个答案,我想每次通过循环检查流的有效性 here .

我的原始代码使用 good 并且看起来类似于:

ifstream foo("foo.txt");

while (foo.good()){
string bar;
getline(foo, bar);
cout << bar << endl;
}

我立即被指出 here并告诉永远不要测试 good。显然这是我不理解的东西,但我想正确地执行我的文件 I/O。

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

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

bleck 1
blee 1 2
blah
ends in new line

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

bleck 1
blee 1 2
blah
this doesn't end in a new line

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

Fourth 是一个丢失的文件(这正确地没有打印任何内容。)

谁能帮我举个例子来说明为什么 good - 不应该进行测试?

最佳答案

他们错了。口头禅是“永远不要测试 .eof()”。

即使这个口头禅也太过分了,因为两者都有助于在提取失败后诊断流的状态。

所以咒语应该更像

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

关于c++ - 为什么 stream::good 是错误的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28299761/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com