eof和fail之间的差异

时间:2015-01-10 12:36:38

标签: c++

我知道,有关于失败和失败的数百个问题,但没有人能够回答我的问题。 在此示例中,仅设置eof位:

while (!Ifstream.eof()){
    Ifstream >> Buffer;
    cout << Buffer << endl;
}

但是在这个例子中,将设置eof位和失败位:

 while (!Ifstream.fail()){
    Ifstream >> Buffer;
    cout << Buffer << endl;
}

这两个差异的原因是什么? 。我只考虑当流到达文件末尾时的情况。

3 个答案:

答案 0 :(得分:4)

faileof的不同之处在于它涵盖了各种其他错误条件,而不是&#34;文件到达其结尾&#34;。

例如,如果Bufferint 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; 这意味着某些进程以错误状态结束,或者在执行进程时发生异常。