iostate知识要点

最后来看看如何利用rdstate()函数和输入状态标记位常量来判断输入流的状态:

  #include <iostream>

  using namespace std;

  int main()

  {

  int a;

  cin>>a;

  cout<<cin.rdstate()<<endl;

  if(cin.rdstate() == ios::goodbit)

  {

  cout<<"输入数据的类型正确,无错误!"<<endl;

  }

  if(cin.rdstate() == ios::failbit)

  {

  cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;

  }

  system("pause");

  return 0;

  }

  利用前面所讲的rdstate() 函数返回值原理和输入状态标记位常量表,不难理解:

  rdstate() 函数返回当前流对象的failbit、eofbit、badbit3个标记位状态的十进制值

  输入状态格式常量也是failbit、eofbit、badbit3个标记位状态的十进制值

  比如cin流状态读取错误,即failbit标记位为1,eofbit标记位为0,badbit标记位为0,则:

  cin.rdstate()的返回值为4,而格式常量ios::failbit的十进制也是4

  因此,if(cin.rdstate() == ios::failbit) 判断为Ture

  因此程序当中的两个if语句能有效识别出流状态

  再来看看有些许不同的程序:

  #include <iostream>

  using namespace std;

  int main()

  {

  cin.setstate(ios::failbit);

  cin.setstate(ios::eofbit);

  cout<<cin.rdstate()<<endl;

  if(cin.rdstate() == ios::goodbit)

  {

  cout<<"输入数据的类型正确,无错误!"<<endl;

  }

  if(cin.rdstate() == ios::failbit)

  {

  cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;

  }

  system("pause");

  return 0;

  }

  输出结果为:

  6

  请按任意键继续...

  原因为何?

  cin流状态被设置成failbit标记位置为1,eofbit标记位置为1,badbit标记位为0

  那么cin.rdstate()的返回值二进制为110,十进制为6,即输出6。

  参照输入状态标记位常量表:

  ios::goodbit的二进制为000,十进制为0,因此if(cin.rdstate() == ios::goodbit)判断为False

  ios::failbit的二进制为100,十进制为4,因此if(cin.rdstate() == ios::failbit)判断为False

  然后system("pause"); 语句使得输出 请按任意键继续...

  很有意思吧,cin对象明明failbit标记位为1,但表达式cin.rdstate() == ios::failbit却是False,这就是原因。

  rdstate()函数与输入状态标记位常量的对比是严格按照数值对比的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值