为什么在我输入 EOF 时设置了 failbit?

Why is failbit set when I enter EOF?

我目前正在学习 while (cin >> num) 的工作原理,我发现有两个步骤。 第一个是 operator>> 函数 return 一个具有错误状态的 istream 对象,第二个是 bool 转换器,根据其状态将 istream 对象转换为 bool。

但我发现在 bool convert 函数中令人困惑,它只有在设置了 failbit 或 badbit 时才会 return 0。并且 operator>> 函数将在读取 EOF 时设置 eofbit。

布尔转换函数:https://www.cplusplus.com/reference/ios/ios/operator_bool/

运算符>>函数:https://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

在这种情况下,在我输入 EOF 之后,bool 转换器应该 return 1 因为 failbit 和 badbit 没有设置。

因此,我使用下面的程序来检查进入EOF后错误位到底发生了什么。 而且我发现进入EOF后会设置failbit!!

所以我想知道是否有人可以帮助我理解为什么设置了 failbit?

#include <iostream>

using namespace std;

int main()
{
    int num;
    cin >> num;
    cout << cin.eof() << " " << cin.fail() << " " << cin.bad() << endl;
    return 0;
}

输入:^Z(在 windows 使用 qt creator,非 qt c++ 项目) 输出:1 1 0

输入:^D(在 windows 使用 qt creator,非 qt c++ 项目) 输出:0 1 0

如果EOF是第一个输入,operator>>读取整数失败,所以流进入fail()状态。

如果您在 Ctrl-Z 之前至少键入一位数字,则该数字被读取并且输入成功。

eofbit 当读操作在将数据读入流缓冲区时遇到 EOF 时设置。数据尚未处理。

failbit 当请求的数据未能从缓冲区中提取时设置,例如当使用 operator>> 读取整数时。在等待数字到达时,可能会发生 EOF。单独 eofbit 不足以进入错误状态,因为缓冲区中可能有可用数据。

因此,例如,假设使用了 while (cin >> num) 循环并且用户输入 123<Ctrl-Z>.

  • 在第 1 次迭代中,operator>>123 读入缓冲区,然后遇到 Ctrl-Z,因此它设置 eofbit 并停止阅读。 123 然后从缓冲区中提取到 num 并且操作员退出。此时,流尚未处于错误状态。当流的 bool 转换由 while 评估时,它 returns 为真,允许输入 while 主体以便它可以处理 num.

  • 在下一次迭代中,operator>> 看到 eofbit 已设置,阻止进一步阅读。缓冲区中没有任何内容可提取到 num,因此操作员设置 failbit 并退出。流现在处于错误状态。当流的 bool 转换由 while 求值时,它 returns 为假,打破了 while 循环。