c++ cin

C++中负责的输入/输出的系统包括了关于每一个输入/输出操作的结果的记录信息。这些当前的状态信息被包含在io_state类型的对象中。io_state是一个枚举类型(就像open_mode一样),以下便是它包含的值。
  • goodbit 无错误
  • Eofbit 已到达文件尾
  • failbit 非致命的输入/输出错误,可挽回
  • badbit 致命的输入/输出错误,无法挽回

这四个标记位均为bit位,标记值为0或者1,每个标记位0表示清除,1表示设置。

 

其中failbit,badbit,Eofbit组成了流状态

当这3个标记位都设置为0,则流状态正常,3个标记位某一个或几个设置为1时,流状态出现相应的问题。

 

goodbit这个标记位是另一种流状态的表示方法

failbit,badbit,Eofbit这3个标记位都为0,即流状态无异常,goodbit标记位为1,表示流状态正常

failbit,badbit,Eofbit这3个标记位任何一个为1,即流状态有异常,goodbit标记位为0,表示流状态非正常

goodbit含义为:流状态正常 标记位。该位设置为1,表示流状态正常,为0则流状态非正常。

 

1表示肯定,0表示否定,再结合标记位的名称,即可得出标记位当前状态的含义。

bool fail();
bool eof();
bool bad();
bool good();
这四个函数分别测试相应的标记位,如果标记位被设置,则相应的测试函数返回True。
如果将函数返回值进行输出,输出的并非Ture或者False,而是1或者0。
那么,这就表示如果测试函数的结果输出为1,表示对应的标记位被设置
比如,假设failbit被设置了(failbit值为1),则流状态出现了“fail”,即流状态异常,那么:
输入流将关闭,即cin不能再工作,且goodbit的值变为1。
再来看看输入状态标记位、状态测试函数、状态设置函数之间的关系:

 

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

 

标记位常量

常量

含义

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的流状态情况相同,但当执行完第二条语句,本质区别就显露出来。

posted @ 2012-05-02 14:11  open your eyes  阅读(776)  评论(0编辑  收藏  举报