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