IO 知识笔记

   IO条件状态

  IO标准库管理一系列条件状态(condition state)成员,用来标记给定的IO对象是否处于可用状态,或者碰到了那种特定的错误。

  IO标准库的条件状态如下:

    

strm::iostate   机器相关的整型名,由各个iostream类定义,用于定义条件状态
strm::badbit    strm::badbit 类型的值,用于指出被破坏的流
strm::failbit     strm::failbit  类型的值,用于指出失败的IO操作
strm::eofbit     strm::eofbit 类型的值,用于指出流已经到达文件结束符

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        

 

 

badbit 标志着系统级的故障,如无法恢复的读写错误。如果出现该类错误,通常标志着该流无法继续使用了。

failbit  一般为可以修正的错误,如期待接受数值类型数据却输入了字符。

 

一般来讲,如果出现failbit等错误后需要修正是,需要清空缓冲区中不合法的数据,

比如用

cin.clear(istream::failbit)

重置failbit状态后,用cin.ignore()函数清除错误数据

cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');

 cin.ignore 的作用是从流中提取数据,被提取的数据将被忽略。

第一个参数是一个数字,如果提取的字节数达到这个数字或者遇到第二个参数'\n',则函数执行终止。因此为了保证提取流中的字节时能够匹配到'\n',

一般要将第一个参数的数值取到足够大。

 

 

 

    输出缓冲区的刷新

  

            cout << "hello" << flush;        //flushes the buffer ;adds no data
            cout << "hello" << ends;        //insert a null ,then flushes the buffer
            cout << "hello" << endl;        // insert a newline ,then flushes the buffer

 

    如果程序崩溃了,则不会刷新缓冲区。

    

    标准库将cout 与 cin 捆绑在一起,即任何读取输入流的尝试都会导致与其相关联的输出流缓冲区被首先刷新。

    cin >> ival;

     导致cout关联的缓冲区被刷新。

 

posted @ 2014-11-04 23:45  schnappi  阅读(554)  评论(0编辑  收藏  举报