为什么在我输入 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>>
将 1
、2
、3
读入缓冲区,然后遇到 Ctrl-Z,因此它设置 eofbit
并停止阅读。 123
然后从缓冲区中提取到 num
并且操作员退出。此时,流尚未处于错误状态。当流的 bool
转换由 while
评估时,它 returns 为真,允许输入 while
主体以便它可以处理 num
.
在下一次迭代中,operator>>
看到 eofbit
已设置,阻止进一步阅读。缓冲区中没有任何内容可提取到 num
,因此操作员设置 failbit
并退出。流现在处于错误状态。当流的 bool
转换由 while
求值时,它 returns 为假,打破了 while
循环。
我目前正在学习 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>>
将1
、2
、3
读入缓冲区,然后遇到 Ctrl-Z,因此它设置eofbit
并停止阅读。123
然后从缓冲区中提取到num
并且操作员退出。此时,流尚未处于错误状态。当流的bool
转换由while
评估时,它 returns 为真,允许输入while
主体以便它可以处理num
.在下一次迭代中,
operator>>
看到eofbit
已设置,阻止进一步阅读。缓冲区中没有任何内容可提取到num
,因此操作员设置failbit
并退出。流现在处于错误状态。当流的bool
转换由while
求值时,它 returns 为假,打破了while
循环。