我知道,有关于失败和失败的数百个问题,但没有人能够回答我的问题。 在此示例中,仅设置eof位:
while (!Ifstream.eof()){
Ifstream >> Buffer;
cout << Buffer << endl;
}
但是在这个例子中,将设置eof位和失败位:
while (!Ifstream.fail()){
Ifstream >> Buffer;
cout << Buffer << endl;
}
这两个差异的原因是什么? 。我只考虑当流到达文件末尾时的情况。
答案 0 :(得分:4)
fail
与eof
的不同之处在于它涵盖了各种其他错误条件,而不是&#34;文件到达其结尾&#34;。
例如,如果Buffer
为int Buffer
,那么第二个将在阅读ABC
时停止,其中第一个将永远循环(没有取得任何进展,如ABC
不是数字输入)。
当然,正确的做法是:
while(Ifstream >> Buffer)
{
cout << Buffer << endl;
}
将停止EOF和无效输入(如果适用),以及cout << Buffer << endl;
或fail
条件发生时不执行eof
。
[注意while(!eof())
解决方案在例如Pascal中有效,因为在Pascal中,输入是&#34;预读&#34;,因此当前读取知道是否&#34;下次阅读将导致EOF&#34;在你真正尝试阅读它之前。在您实际读取文件末尾之前,C和C ++不会标记EOF。
答案 1 :(得分:3)
差异很小。
第一段代码,只要它没有达到EOF条件就会尝试读取。然后就打破了。但是,如果由于某种原因发生错误(即无法通过<<
运算符转换数据),这段代码将无限循环,因为FAIL将被设置为错误,读取将停止,并且EOF永远不会被命中
第二段代码使用一个小技巧。只要它可以读取它,并在发生错误时停止。好的,合乎逻辑。但是,当命名为文件结尾时,但是IIRC的EOF条件还没有设置。因此,循环将再次运行,尝试读取EOF状态,这将上升FAIL标志并打破循环。但这也意味着你将得到一个处理(cout&lt;
正确的方法是立即检查READING是否成功:
while (true){
if(!(Ifstream >> Buffer))
break;
cout << Buffer << endl;
}
只有这样才能保证一旦读取失败就会停止循环,无论是EOF还是失败或其他原因。
正如MatsPetersson和πάνταῥεῖ所建议的那样,上面的片段可能被“压扁”形成:
while (Ifstream >> Buffer)
cout << Buffer << endl;
这是写它的常用方法。不需要fail/good/eof
检查。从operator>>
返回的值是流本身(如在operator<<
中),并且流可以测试“真实性”,所以它就像那样简单。在谈论失败/好/差异时,我喜欢写更长的形式来强调...你不应该在while-condition中使用fail / good / eof,并且你应该检查流的状态只有在真正尝试从中读取之后。 while(true)
非常清楚地表明了这一点。
答案 2 :(得分:1)
Programically, &#39;阅读中的EOF&#39;并且“没有阅读&#39;用不同的方式描述。
EOF表示文件结束。 因此,程序员知道他们何时必须停止阅读文件。
但是&#39;失败&#39;表示未成功&#39; 这意味着某些进程以错误状态结束,或者在执行进程时发生异常。