[英]Why is failbit set when I enter EOF?
我目前正在学习while (cin >> num)
如何工作,我发现有两个步骤。 First one is the operator>> function return a istream object with error state, and the second is bool converter that convert istream object into bool depend on its state.
但我发现在布尔转换 function 中令人困惑的是,只有在设置了失败位或坏位时它才会返回 0。 并且操作员>> function 如果读取 EOF 将设置 eofbit。
布尔转换 function: https://www.cplusplus.com/reference/ios/ios/operator_bool/
运营商>> function: https://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
在这种情况下,在我输入 EOF 后,布尔转换器应该返回 1,因为未设置故障位和坏位。
因此,我使用下面的程序来检查输入 EOF 后错误位实际发生了什么。 而且我发现进入EOF后会设置failbit!
所以我想知道是否有人可以帮助我理解为什么设置失败位?
#include <iostream>
using namespace std;
int main()
{
int num;
cin >> num;
cout << cin.eof() << " " << cin.fail() << " " << cin.bad() << endl;
return 0;
}
Input: ^Z(on windows using qt creator, non qt c++ project) Output: 1 1 0 Input: ^D(on windows using qt creator, non qt c++ project) Output: 0 1 0
当读取操作在将数据读取到流的缓冲区时遇到 EOF 时设置eofbit
。 数据尚未处理。
当请求的数据无法从缓冲区中提取时设置失败位,例如使用operator>>
读取failbit
时。 在等待数字到达时,可能会发生 EOF。 仅eofbit
不足以输入错误 state,因为缓冲区中可能有可用数据。
因此,例如,假设使用了一个while (cin >> num)
循环并且用户输入123<Ctrl-Z>
。
在第一次迭代中, operator>>
将1
、 2
、 3
读入缓冲区,然后遇到 Ctrl-Z,因此它设置eofbit
并停止读取。 然后将123
从缓冲区中提取到num
中,然后操作员退出。 此时,stream 尚未出现错误 state。 当通过while
评估流的bool
转换时,它返回 true,允许输入while
主体以便它可以处理num
。
在下一次迭代中, operator>>
看到eofbit
已设置,从而阻止进一步阅读。 缓冲区中没有任何东西可以提取到num
中,因此操作员设置了failbit
并退出。 stream 现在出现错误 state。 当通过while
评估流的bool
转换时,它返回 false,从而中断while
循环。
如果 EOF 是第一个输入,则operator>>
无法读取 integer,因此 stream 输入了fail()
state。
如果您在 Ctrl-Z 之前至少键入一位数字,则会读取该数字并且输入成功。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.