zoukankan      html  css  js  c++  java
  • 关于if (!cin)以及while (cin >> word)

    首先注意:

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

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

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

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

    接下来看看这个程序:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int main()
     5 {
     6         int   input;
     7         while  (cin >> input)
     8         {
     9                cout   <<  input  <<  endl;
    10                cout << "rdstate()函数的返回值: " << cin.rdstate() << endl; 
    11                cout << "三个标记位返回的返回值: " << cin.bad() << cin.fail() << cin.eof() << endl;
    12                cout << "goodbit标记位的返回值: " << cin.good() << endl; 
    13                cout << endl; 
    14         }
    15         
    16         cout << "rdstate()函数的返回值: " << cin.rdstate() << endl; 
    17         cout << "三个标记位返回的返回值: " << cin.bad() << cin.fail() << cin.eof() << endl;
    18         cout << "goodbit标记位的返回值: " << cin.good() << endl; 
    19         
    20         if   (!cin)    
    21              cout   <<   "input error"   <<   endl;
    22 
    23         else
    24             cout   <<   input    <<   endl;
    25 
    26         system ("pause"); 
    27         return 0;
    28 }

    当输入为:“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。

    当输入文件结束符(^Z,即Ctrl+Z 或 F6)时,输出为:

    badbit 标志着系统级的故障,如无法恢复的读写错误。如果出现了这类错误,则该流通常就不能再继续使用了。如果出现的是可恢复的错误,如在希望获得数值型数据时输入了字符,此时则设置 failbit 标志,这种导致设置 failbit的问题通常是可以修正的。eofbit 是在遇到文件结束符时设置的,此时同时还设置了 failbit。

    流的状态由 bad、fail、eof 和 good 操作提示。如果 bad、fail 或者 eof中的任意一个为 true,则检查流本身将显示该流处于错误状态。类似地,如果这三个条件没有一个为 true,则 good 操作将返回 true。

    再来看一看下一段代码:

    1 if   (cin   >>   input)
    2       cout   <<   input   <<   endl;
    3 else
    4       cout   <<   "input   error"   <<   endl;
    5 
    6 if   (!cin)
    7       cout   <<   "input   error"   <<   endl;
    8 else
    9       cout   <<   input   <<   endl;

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

    567

    567

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

    但当代码重复一次时:

     1 if   (cin   >>   input)
     2      cout   <<   input   <<   endl;
     3 else
     4      cout   <<   "input   error"   <<   endl;
     5 
     6 if   (!cin)
     7      cout   <<   "input   error"   <<   endl;
     8 else
     9      cout   <<   input   <<   endl;
    10 //第一次代码结束
    11 
    12 if   (cin   >>   input)
    13      cout   <<   input   <<   endl;
    14 else
    15      cout   <<   "input   error"   <<   endl;
    16 
    17 if   (!cin)
    18      cout   <<   "input   error"   <<   endl;
    19 else
    20      cout   <<   input   <<   endl;
    21 //重复代码结束

    如果输入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流状态出现相应状况 ,且在恢复之前,流将对后面的输入关闭。

    不对之处,敬请指教。

    参考文献:http://blog.csdn.net/ygj149078299/article/details/538998

  • 相关阅读:
    系统设计的定量原理
    [Java-基础]单元测试Junit
    二维图元生成:直线生成算法
    [Java-基础]反射_Class对象_动态操作
    浅说模板的局限性
    普通函数和函数模板调用规则
    普通函数和函数模板的区别
    十大排序算法(原理及代码实现细节)
    linux远程登陆以及从其他服务器下载文件
    循环队列-抽象数据类型
  • 原文地址:https://www.cnblogs.com/wangduo/p/5940884.html
Copyright © 2011-2022 走看看