14.6.2 读取流状态

    ios_base类提供了如下函数读取当前的流状态,如表14.8所示。

    14.6.2 读取流状态 - 图1

    以下为流出错的例子,如代码14.23所示。

    代码14.23 流出错范例IOState


    <————————————文件名:example1423.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 int main() 04 { 05 int x,sum=0; 06 while(cin>>x)//当“cin>>x”成功,即输入一直是数时 07 { 08 sum+=x;//累加和 09 } 10 cout<<sum<<endl; 11 if(cin. fail())//如果输入失败 12 { 13 cout<<"匹配失败"<<endl; 14 } 15 return 0; 16 }

    输出结果如下所示。


    1 2 3 4 5(注:键盘输入) 6 7(注:键盘输入) 8 A 7 9(注:键盘输入) 36 匹配失败

    【代码解析】因为输入缓冲,所以第3行的输入在单击回车键前不会发送给程序,但循环在字符A处停止了匹配处理,cin自动将failbit置1,while结构中失效。

    对代码第6行“while(流)”结构来说,只有当流状态为0,即一切正常时,才返回true,否则返回false。除了上述if结构判断用法外,还可以使用switch开关结构对流出错进行处理,以cin为例,如下所示。


    switch(cin.rdstate()) { case(ios_base:goodbit): //一切正常的处理 break; case(ios_base:eofbit): //到达文件尾的处理 break; case(ios_base:failbit): //I/O失败怎么办 break; case(ios_base:badbit): //非法错误怎么办 break: default: //其他问题处理 }