Cpp Primer<<学习IO标准库--条件状态_5

条件状态

strm::iostate机器相关的整形名,由各个iostream类定义,用于定义条件状态
strm:badbitstrm::iostate类型的值,用于指出被破坏的流
strm::failbitstrm ::iostate类型的值,用于指出失败的IO操作
strm::eofbitstrm::iostate类型的值,用于支出流已经到达文件结束符
s.eof()如果设置了流s的eofbit值,则该函数返回true
s.fail()如果设置流s的failbit值,则该函数返回true
s.bad()如果设置了流s的badbit值,则该函数返回true
s.good()如果流s处于有效状态,则该函数返回true
s.clear()将流s中的所有状态值都重设为有效状态
s.clear(flag)将流s中的某个指定条件状态设置为有效,flag的类型为strm::iostate
s.setstate(flag)给流s添加指定条件。flag的类型为strm::iostate
s.rdstate()返回流s的当前条件,返回值类型strm::iostate

1.条件状态

所有流对象都包含一个条件状态成员,该成员有setstate和clear操作管理。setstate操作用于改变条件成员的状态,clear操作将所有条件重设为有效状态。使用setstate,操作操作可打开某个指定的条件,用于表示某个问题的发生。除了添加的标记状态,setstate将保存其它已存在的状态变量不变。
这个状态成员为iostate类型,由各个iostream类分别定义的机器相关的整形。
该状态成员以二进制位(bit)的形式使用。

每个IO类还定义了三个iostate类型的常量值,分别表示特定的位模式,该常量值用于支出特定类型的IO条件,可与位操作符一起使用,方便一次操作检查或设置多个标志。
badbit标志着系统级的故障,如无法恢复的读写错误。
流的状态有bad、fail、
eof和good操作解释。前三者中任意一个为true,则检查本身将像是该流处于错误状态。否则,good操作将返回true.
clear和setstate操作用于改变条件成员的状态。

2.流状态查询和控制

int ival;
// read cin and test only for EOF:loop is executed even if there are other IO failures
while (cin >> ival,!cin.eof()) {
    if (cin.bad())  //  input stream si corrupted;bail out
        throw runtime_error(“IO stream corropted”);
    if (cin.fail()) {                   //  bad input
        cerr << “bad data,try again”;   //  warn the user
        cin.clear(istream::failbit); // reset the stream
        continue;                   //  get next input
    }  //ok to process ival
}

3.条件状态的访问

rdstate成员函数返回一个iostate类型的值,该值记录当前流的条件状态:

//remember curret of cin
istream::iostate old_state = cin.rdstate();
cin.clear();
process_input();  // use cin
cin.clear(old_state);   //  now reset cin to old state

4.多种状态的处理

需要设置多个状态二进制可以多次调用setstate或者clear函数实现,或者是使用按位或操作符(|)一次调用中生成多个状态位。按位或操作使用其操作数的二进制位模式产生一个整型数值。

is.setstate(ifstream::badbit | ifstream::failbit); //sets both the badbit and the failure

同时打开is对象的failbit和badbit且都设置为1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值