五、管理条件状态
流对象的rdstate成员函数返回一个istate值,对应流的当前状态。setstate操作则可将给定条件位置位,表示发生了对应错误。clear是一个重载成员函数,有两个版本,一个不接受任何参数,将清除所有错误标志位,即复位。执行clear()后调用good()会返回true.。一个简单的示例如下:
#include
#include
#include
using namespace std; int main(){ auto old_state = cin.rdstate(); //获取当前流状态 cout << "old_state " << old_state << endl; int a; cin >> a; //在这里你可以输入一个非int类型的值,特意破坏流的正确性 auto current_state = cin.rdstate(); //在此获取流状态,此时显示已经不正常了 cout << "current_state " << current_state << endl; cin.clear(); //使流所有条件状态复位,且流设为有效,这句很重要,否则后面对流的操作都会不成功,不信可试试 cin.setstate(old_state); //现在流有效了,重新使他恢复到最初始状态 auto nex_state = cin.rdstate(); cout << "new_state "<
这里说明下:一定要注意当流发生错误后,如果不clear()对流进行复位,那么后面对流的操作都是不成功的。
而带参数的clear()可以这样使用,让它接受一个iostate值,表示流的新状态,于是我们可以哈斯用rdstate读出的iostate值,即当前的条件状态。然后用位操作将所需要复位来生成新的状态。这里我们要用到一个公式,即
(b)& (~b)=0
现在假如我们想将failbit和badbit复位,即置0,但eofbit保持不变,可以这样做:
cin.clear(cin.rdstate()&~cin.failbit&~cin.badbit);
上面的位与操作是的表示状态的failbit 和badbit会成为0,如此得到一个新的状态,传递个clear()从而达到目的。