关于if (!cin)

首先注意:

       1、每一个输入(输出)对象就代表一个输入(输出)流

       2、输入(输出)对象中的流状态成员标记了输入(输出)流当前的状况,当eofbit、badbit、failbit三个标记位均为0时表示流状态正常

       3、一但某个或几个标记位被设置,表示对象的流状态出现相应状况,流将对后面的输入(输出)关闭,直到标记位被清除

       4、只有在流状态良好的情况下,if或者while对该输入(输出)对象的判断才能是Ture

接下来看看这个程序:

#include <iostream>
using namespace std;

int main()
{
          
        int   input;
        while  (cin >> input)
        {
               cout   <<  input  <<  endl;
               cout << "rdstate()函数的返回值: " << cin.rdstate() << endl; 
               cout << "三个标记位返回的返回值: " << cin.fail() << cin.bad() << cin.eof() << endl;
               cout << "goodbit标记位的返回值: " << cin.good() << endl; 
               cout << endl; 
        }
        
        cout << "rdstate()函数的返回值: " << cin.rdstate() << endl; 
        cout << "三个标记位返回的返回值: " << cin.fail() << cin.bad() << cin.eof() << endl;
        cout << "goodbit标记位的返回值: " << cin.good() << endl; 
        
        if   (!cin)    
             cout   <<   "input error"   <<   endl;

        else
            cout   <<   input    <<   endl;

        system ("pause"); 
        return 0;
}

当输入为:“123   124   158   137a”时,

输出为:

        具体分析如下:

        123、124、158均被正常抽取,从rdstate()等 流状态标记位测试函数的返回结果可以看出来。

        当轮到137a进入程序时,抽取操作符将137成功抽取,将a留在输入流中。抽取操作符“  >>  ”返回cin对象,此时流状态仍为正常,failbit、eofbit、badbit三个标记位的值均为0。然后while判定cin对象为true,使得进入循环输出137及流状态信息。

       接下来进入下一次循环,执行 cin >> input ;   语句:a为输入流的第一个字符,a与input变量类型不匹配,导致cin流状态的failbit标记位被置为1(goodbit标记位被置为0),这使得“  >>  ”返回的cin对象自身检测为False, 然后while判定cin对象为false,退出循环。而字符a,留在了输入流中。

       推出循环后输出cin的流状态,可以看出,rdstate()的结果是4,failbit标记位为1,goodbit标记位为0。

       程序流程到了 if  语句,此时cin对象的failbit标记位已经被置为1(goodbit标记位被置0),if 判定cin对象为false ,那么 !cin 为true,因此输出input   error。

       再来看一看下一段代码:

       if   (cin   >>   input)

            cout   <<   input   <<   endl;

       else

            cout   <<   "input   error"   <<   endl;

       if   (!cin)

            cout   <<   "input   error"   <<   endl;

       else

            cout   <<   input   <<   endl;

当输入为567a时,输出为:

567

567

原因:输入流中的567被“   >>   ”抽取到  input  中,因此抽取操作符“   >>   ”返回的cin对象的流状态成员正常。因此 !cin  为false,使得再一次输出567。注意:字符a留在了输入流。

但当代码重复一次时:

       if   (cin   >>   input)

            cout   <<   input   <<   endl;

       else

            cout   <<   "input   error"   <<   endl;

       if   (!cin)

            cout   <<   "input   error"   <<   endl;

       else

            cout   <<   input   <<   endl;

//第一次代码结束

       if   (cin   >>   input)

            cout   <<   input   <<   endl;

       else

            cout   <<   "input   error"   <<   endl;

       if   (!cin)

            cout   <<   "input   error"   <<   endl;

       else

            cout   <<   input   <<   endl;

//重复代码结束

如果输入567a,输出是:

567

567

input   error

input   error

           原因是:当第一次代码正常完成后, 第二次代码开始,输入流中的第一个字符是a,a与input不匹配,“   >>   ”无法抽取, 抽取操作符“   >>   ”函数返回的cin对象,其failbit标记位被置为1(goodbit标记位被置为0)  ,cin的自测为False,if  判定条件为false;且导致下一个if语句:  if   (!cin)    中, cin对象为false, !cin  为true。

           真相是:只要抽取操作符“   >>   ”能成功抽取输入流中的数据,哪怕只是部分匹配,cin对象的流状态成员(即标记位)不会被设置,流状态仍将保持正常。

                  一旦输入完全不匹配,“   >>   ”无法进行任何抽取,返回的cin对象其failbit标记位置为1(goodbit标记位被置0),cin流状态出现相应状况 ,且在恢复之前,流将对后面的输入关闭。

不对之处,敬请指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值