gpt4 book ai didi

C++ istream EOF 不保证 failbit?

转载 作者:行者123 更新时间:2023-11-27 23:07:59 24 4
gpt4 key购买 nike

我读了一个question在 Stack Overflow 上,istream file 的 eofbit 已设置,但 failbit 未设置。在这种情况下,file 为真且 file.eof() 为真但 file.good() 为假。例如,文件大小恰好为一个字节:

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 失败而另一个失败?另一个线程中的答案是“每当您遇到文件末尾而没有尝试读取它的后面时”。读后面呢?这是什么意思?

最佳答案

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

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

一般来说,eofbit“表示一个输入操作到达了输入序列的末尾”,而failbit“表示一个输入操作未能读取预期字符”(两个引号均来自 C++ 标准,[ios.types] 部分;§27.5.3.1,表 124,在我手头的最新草案中。)作为 getline 示例表明,输入操作很有可能读取输入序列的末尾,同时仍在读取某些内容。

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

关于C++ istream EOF 不保证 failbit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22031398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com