C ++ istream EOF不保证failbit?

时间:2014-02-26 03:55:52

标签: c++ eof

我在Stack Overflow上读了一个question,其中istream file的eofbit已设置,但failbit不是。在这种情况下,文件为true,file.eof()为true,但file.good()为false。例如,文件大小只有一个字节:

ifstream file("one.txt");
assert( file.is_open() );
for( int i = 0; i < 2; ++i )
{
    char chars[255] = {0};
    file.getline(chars, 2);
    //file.read( chars, 2 );

    cout << "file: " << !!file << endl;
    cout << "good: " << file.good() << endl;
    cout << "eof: " << file.eof() << endl;
    cout << "fail: " << file.fail() << endl;
    cout << "bad: " << file.bad() << endl;
    cout << endl;
}

这是输出:

file: 1
good: 0
eof: 1
fail: 0
bad: 0

file: 0
good: 0
eof: 1
fail: 1
bad: 0

如果我注释掉getline()并使用read(),我会得到:

file: 0
good: 0
eof: 1
fail: 1
bad: 0

file: 0
good: 0
eof: 1
fail: 1
bad: 0

在这两种情况下,我都是在循环的第一次迭代中读取文件的末尾。为什么一个EOF失败而另一个不失败?另一个帖子中的答案是“每当你遇到文件的结尾而不试图在它后面阅读时”。看完背后呢?这是什么意思?

1 个答案:

答案 0 :(得分:4)

eofbitgetline方法设置,如果它停止读取,因为它到达流(文件)的末尾,而不是找到分隔符。在这种情况下,getline 设置failbit,这是合乎逻辑的,因为它没有失败:它读取了一些数据。

设置eofbit后,该流上的下一个读取操作将设置failbit,因为几乎每个输入操作开始时调用的内部哨兵函数将设置{{ 1}}如果设置了failbit

通常,eofbit“表示输入操作已到达输入序列的末尾”,而eofbit“表示输入操作未能读取预期字符”(两个引号均为来自C ++标准,第failbit部分;第27.5.3.1节,表124,在我最近的草案中。)正如[ios.types]示例所示,输入操作很有可能读取输入序列的结束,同时仍在阅读。

另一种看起来不太正式 - 因此可能不正确 - 的方法是,如果读取操作到达文件末尾,则设置getline,而设置eofbit如果读操作无法读取所需的最小字符数。调用failbit2getline表示不同的内容;在read中,输入操作的最大字符数(最小数字为1);在getline的情况下,它是精确的字符数。