之前一直在学习unix/linux,在这类操作系统中作业时也曾碰到相关的概念,而unix和类unix系统均是由C语言实现的,而且该C语言也不是同一标准,而是由ANSI C和POXIS  C混杂而成,在该系统中的标准I/O使用的是文件I/O和标准I/O概念,正是由于unix把所有的设备和普通文件多当成文件来处理,从一个比较抽象的层面把一些细节上的东西给屏蔽了.

  这段时间又回过头来看很久没看的<<C++ PRIME>>,很多方面体会都发生着改变.

  C++中标准I/O使用的是流的概念(unix中也有流的概念stream,STREAM),通过流来控制相关的输入输出,同时C++作为一门比较高级的语言,在标准I/O中有继承层次的概念,

  看看这个图

初探标准I/O库_unix

 

  条件状态:

  


 

        strm::iostate         机器相关的整型名,由各个iostream类定义,用于定义条件状态.
        strm::badbit          strm::iostate类型的值,用于指出被破坏的流.
        strm::failbit         strm::iostate类型的值,用于指出失败的IO操作.
        strm::eofbit          strm::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.


  所有流对象都包含一个条件状态成员,该成员由setstate和clear操作设置.这个状态成员为iostate类型.

  每个I/O类还定义了三个iostate类型的常量值,分别表示特定的位模式.这些常量值用于指出特定类型的I/O条件,可与位操作符一起使用.

  badbit标志着系统级的故障,如无法恢复的读写错误.如果出现了这类错误,则该流通常就不能继续使用了.如果出现的是可以恢复的错误,如在希望获得int类型的数据时,获得了string类型的数据,此时则设置failbit标志,这种导致设置failbit的问题通常是可以修正的.eofbit是在遇到文件结束符时设置的,此时同时还设置了failbit.

  流的状态由bad,fail,eof和good操作提示.如果bad,fail或者eof的任意一个为true,则检查流本身将显示处于错误状态,类似的,如果这三个条件没有一个为true,则good操作将返回true.

  clear和setstate操作用于改变条件成员的状态.clear操作将条件设为有效状态,使用setstate操作可打开某个指定的状态,用于表示某个问题的发生,除了添加的标记状态,setstate将保留其他已存在的状态变量不变.

 

  条件状态的访问和处理例程:


#include <iostream>
using namespace std;

int main()
{
    void pr_state(istream &in);

    istream::iostate state = cin.rdstate();
    pr_state(cin);

    cin.setstate(istream::badbit | istream::failbit);
    pr_state(cin);

}
void pr_state(istream &in)
{
    if(in.good())
    {
        cout<<"state : good/n";
        return ;
    }
    else
    {
        if(in.bad())
            cout<<"state : badbit/n";
        if(in.fail())
            cout<<"state : failbit/n";
        if(in.eof())
            cout<<"state : eof"<<endl;
        return ;
    }
}

输出:

state : good
state : badbit
state : failbit


 

完毕!