繁体   English   中英

为什么输入EOF时会设置failbit?

[英]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>>123读入缓冲区,然后遇到 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM