【问题标题】:C++ istream EOF does not guarantee failbit?C++ istream EOF 不保证失败位?
【发布时间】:2014-02-26 03:55:52
【问题描述】:

我在 Stack Overflow 上读到了 question,其中设置了 istream file 的 eofbit,但未设置故障位。在这种情况下,file 为 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 和失败而一个不是?另一个线程中的答案是“每当您遇到文件末尾而不尝试在其后面读取时”。后面读了吗?这是什么意思?

【问题讨论】:

    标签: c++ eof


    【解决方案1】:

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

    一旦设置了eofbit,对该流的下一次读取操作将设置failbit,因为在几乎每个输入操作开始时调用的内部哨兵函数将设置failbit,如果@987654328 @ 已设置。

    一般来说,eofbit“表示输入操作到达了输入序列的末尾”,而failbit“表示输入操作未能读取预期的字符”(两个引号均来自 C++ 标准,[ios.types] 部分;第 27.5.3.1 节,表 124,在我的最新草案中。)正如getline 示例所示,输入操作很可能读取输入序列的结尾,而还在读东西。

    另一种不太正式(因此可能不正确)的方式是,如果读取操作到达文件末尾,则设置eofbit,而如果读取操作,则设置failbit无法读取所需的最少字符数。对getlineread 的调用中的2 表示不同的含义;在getline 中,是输入操作的最大字符数(最小为1);对于read,它是精确的字符数。

    【讨论】:

    • 感谢您的详细解答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    相关资源
    最近更新 更多