成功开放但不好?

时间:2012-09-27 16:55:28

标签: c++ file stream

在C ++中,是否有std::ifstream open()可以成功的情况,但std::ifstream good()可能是假的?

编辑:使用g ++ 4.7.1进行测试

#include <iostream>
#include <fstream>
int main(int argc, char *argv[])
{
    std::ifstream filestream("testfile");
    std::cout<<filestream.good()<<std::endl;
    std::cout<<filestream.eof()<<std::endl;
    std::cout<<filestream.fail()<<std::endl;
    std::cout<<filestream.bad()<<std::endl;
    return 0;
}
对于空文件,

将返回:1,0,0,0,表示good = TRUEeof = fail = bad = FALSE。这是正常的吗?

3 个答案:

答案 0 :(得分:3)

在验证标准中的实际文本后,我认为eofbit之后不允许设置openbadbit如果实际打开引发异常则可以设置failbit (我认为 - 标准并没有说明在这种情况下会发生什么);如果打开失败,或者打开后的搜索(如果设置了ate)失败,则应设置eofbit;但似乎没有任何情况可以设置std::istream::good()

在这种情况下,不是调用std::istream::good()是一个很好的解决方案。 (知道OP试图实现的目标会很有趣。无论是什么,调用std::ifstream::good()可能都不是正确的解决方案。)

如果false返回true,则下一个输入将失败。 如果它返回{{1}},则它不会告诉您:下一个输入可能成功, 但它也可能失败。

答案 1 :(得分:2)

如果文件为空,则会触发eofbit,但文件仍然会打开,所以是的。

答案 2 :(得分:1)

ifstream::open返回无效,因此请注意它的“成功”,请注意您的意思。

该标准适用于basic_ifstream::open(27.9.1.9):

  

效果:调用rdbuf() - &gt; open(s,mode | ios_base :: in)。如果那个功能   不返回空指针调用clear(),否则调用   setstate(failbit)(可能会抛出ios_base :: failure)

因此,如果对filebuf的open调用返回一个表示成功的值,那么ifstream::open将清除所有错误位,因此good()必须返回true。

如果对filebuf的open调用返回一个表示失败的值,那么ifstream::open可以返回而不会抛出异常。此行为可能与“成功”混淆,但在这种情况下,good()返回false,因为已设置failbit。

我并不完全清楚为什么这会设置故障位而不是badbit,但我不认为我缺乏理解会妨碍报告事实: - )