之前一直在学习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中有继承层次的概念,
看看这个图
条件状态:
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
完毕!