C++istream EOF不能保证故障位
C++ istream EOF does not guarantee failbit?
我读到一个关于堆栈溢出的问题,其中istreamfile
的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和失败,而另一个不是?另一个线程中的答案是"每当你遇到一个文件的末尾而没有试图在它后面阅读时"。在它后面读吗?这是什么意思?
eofbit
是由getline
方法设置的,如果它因为到达流(文件)的末尾而停止读取,而不是通过查找分隔符。在这种情况下,getline
不会设置failbit
,这是合乎逻辑的,因为它没有失败:它读取了一些数据。
一旦设置了eofbit
,该流上的下一个读取操作将设置failbit
,因为如果设置了eofbit
,则在几乎每个输入操作开始时调用的内部哨兵函数将设置failbit
。
通常,eofbit
"表示输入操作到达输入序列的末尾",而failbit
"表示输入运算未能读取预期字符"(这两个引号都来自C++标准,[ios.types]
;§27.5.3.1节,表124,我所掌握的最新草案。)如getline
示例所示,输入操作很可能在读取某些内容的同时读取输入序列的末尾。
另一种不太正式的——因此可能是不正确的——看待这一点的方式是,如果读取操作到达文件末尾,则设置eofbit
,而如果读取操作无法读取所需的最小字符数,则设置failbit
。对CCD_ 17和CCD_ 18的调用中的CCD_;在getline
中,它是输入操作的最大字符数(最小为1);在read
的情况下,它是精确的字符数。
- 分段故障(堆芯转储)矢量
- 如何确定我已使用非编码文件到达 EOF?
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 调试 CUDA MMU 故障
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 正在处理故障(堆芯转储)
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- 而(!inputfile.eof())只读取第一行?
- C++函数过载会导致 SEG 故障
- C++istream EOF不能保证故障位
- EOF功能故障
- 为什么在读取时找到 eof 时设置故障位
- c++eof和故障位在读取二进制文件的过程中