C++ I/O库流状态标志位

转载 2016年05月31日 19:14:33

再来看看输入状态标记位、状态测试函数、状态设置函数之间的关系:

 

输入状态标记位常量有以下几个:

 

 

标记位常量

常量

含义

failbit标记位的值

eofbit标记位的值

badbit标记位的值

转化为10进制

iOS::failbit

输入(输出)流出现非致命错误,可挽回

1

0

0

4

ios::badbit

输入(输出)流出现致命错误,不可挽回

0

0

1

2

ios::eofbit

已经到达文件尾

0

1

0

1

ios::goodbit

流状态完全正常

0

0

0

0

下面来解释这张表格:

ios::failbit    ios::badbit    ios::eofbit    ios::goodbit均为常量,它们任何一个都代表了一种流状态,因此称为“输入状态标记位常量”。

比如,ios::failbit表示的是流状态为

                           流的failbit标记位值为1,eofbit标记位值为0,badbit标记位的值为0。

         始终牢 记:failbit,badbit,Eofbit组成了流状态

         注意:它们不是failbit、badbit、eofbit、goodbit这四个标记位的存贮变量。

                         

我们可以用输出语句来验证:

        cout << ios:: failbit << endl;
        cout << ios:: eofbit << endl;
        cout << ios:: badbit << endl;

        cout << ios:: goodbit << endl;

输出的结果为:

4

2

1

0

同样是将3个标记位视为二进制数转化为十进制的原理。

下面分析clear()函数:

cin.clear(ios::failbit);

使 得cin的流状态将按照ios::failbit所描述的样子进行设置:failbit标记位为1,eofbit标记位为0,badbit标记位为0。无 需担心goodbit标记位,failbit、eofbit、badbit任何一个为1,则goodbit为0。(goodbit是另一种流状态的表示方 法)

                                             

 

cin.clear(ios::goodbit);

使得cin的流状态将按照ios::goodbit所描述的样子进行设置:failbit标记位为0,eofbit标记位为0,badbit标记位为0。此时goodbit标记位为1,从另一个角度表示cin的流状态正常。

 

因此clear() 函数作用是:将流状态设置成括号内参数所代表的状态,强制覆盖掉流的原状态。

 

 

再来分析一下setstate()函数:

与clear()函数不同,setstate()函数并不强制覆盖流的原状态,而是将括号内参数所代表的状态叠加到原始状态上。

                         

比如,假设cin流状态初始正常:

cin.setstate (ios::failbit);      //在cin流的原状态的基础上将failbit标记位置为1

cin.setstate (ios::eofbit);     //在上一步结束的基础上,将cin流状态的eofbit标记位置为1

两条语句结束后,cin的faibit标记位和eofbit标记位均为1,badbit标记位为0

                                            

对比clear()函数的效果:

cin.clear (ios::failbit);      //将cin的流状态置为ios::failbit所描述的状态

cin.clear (ios::eofbit);     //将cin的流状态置为ios::eofbit所描述的状态

两条语句结束后,cin的eofbit标记位为1,而failbit标记位和badbit标记位为0

即使两种情况,在执行完各自的第一条语句后,cin的流状态情况相同,但当执行完第二条语句,本质区别就显露出来。

                                              

                                   

                                        

最后来看看如何利用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()函数与输入状态标记位常量的对比是严格按照数值对比的。

                   

 

 

 

 

 

 

 

另外:关于cin对象,输入内容与接受的变量 完全匹配,部分匹配,完全不匹配的各种情况下,标记位将会如何变化,请参考http://blog.csdn.net/ygj149078299/archive/2005/11/29/538998.aspx

 

 

 

不对之处,敬请指教。

 

原帖:http://blog.csdn.net/ygj149078299/archive/2006/08/18/1090432.aspx

C++ I/O库流状态标志位

再来看看输入状态标记位、状态测试函数、状态设置函数之间的关系: 输入状态标记位常量有以下几个:  标记位常量 常量含义failbit标记位的值eofbit标记位的值badbit标记位的值转化为1...
  • clearriver
  • clearriver
  • 2009年07月21日 14:21
  • 3484

C++中 I/O流总结

程序的输入是指把输入文件数据传送给程序,程序的输出是指从程序中把输出结果传送给输出文件。C++中输入输出大致上有以下三种: 1)标准I/O------对系统指定的标准设备的输入输出。(eg:从键盘输...
  • x1247600186
  • x1247600186
  • 2014年05月26日 23:58
  • 1186

C++流之标准I/O流

1、什么是标准I/O? 2、标准I/O的类的继承关系是什么? 3、ios类中几个常用的枚举类是什么? 4、ios类中的成员函数有哪些? 5、什么是格式控制符?...
  • dingyanxxx
  • dingyanxxx
  • 2015年08月09日 20:51
  • 917

C++中的I/O流类库与输入输出简述

(1)如C语言一样,C++语言中也没有输入输出语句。但C++编译系统带有一个面向对象的输入输出软件包,即I/O流类库。   (2)在C++中,将数据从一个对象到另一个对象的流动抽象为‘流’。流是一种...
  • cafuc46wingw
  • cafuc46wingw
  • 2014年08月19日 10:44
  • 579

Java I/O流类库总结

Java中的I/O输入和输出 1、流:代表任何有能力产出数据和数据源对象,或者有能力接收数据的数据端对象(流概念屏蔽了I/O设备中处理数据的底层细节); 2、Java类库中...
  • Al_assad
  • Al_assad
  • 2016年10月31日 23:31
  • 347

I/O流——对象和类入门

I/O指的是程序的输入和输出。输入可自键盘或者一个文件中获得,输出可以发送至屏幕或文件。 1、 流和基本文件I/O       流(stream)是一个由字符(或者其他类型的数据)构成的“...
  • sense_poetry
  • sense_poetry
  • 2016年05月18日 15:05
  • 400

标准I/O库

标准的I/O是由ANSI C标准规定的,不仅可以在UNIX/Linux上使用,还可以在其他地方使用。了解标准I/O库的细节,能使我们更好的使用标准I/O库。...
  • KangRoger
  • KangRoger
  • 2014年08月20日 16:41
  • 2224

C++ I/O流用法

 库自动定义了一些标准对象:cout, ostream类的一个对象,可以将数据显示在标准输出设备上. cerr, ostream类的另一个对象,它无缓冲地向标准错误输出设备输出数据. clog, 类似...
  • jackyxwr
  • jackyxwr
  • 2009年11月25日 13:50
  • 3874

C++ I/O流库

概 述        在C语言中,输入/输出系统的特点是缺乏类型检查机制。如printf函数,在格式控制字符串后的参数,即使类型和个数与其不匹配,编译是不会出错,但运行时会得到错误的结果...
  • pud_zha
  • pud_zha
  • 2013年04月17日 13:42
  • 623

Java I/O 流详解

原文地址: http://blog.csdn.net/jiangwei0910410003/article/details/22376895 摘要: Java 流在处理上分为字符流和...
  • jason_rainbow
  • jason_rainbow
  • 2016年03月17日 11:40
  • 439
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ I/O库流状态标志位
举报原因:
原因补充:

(最多只允许输入30个字)