几种IO类型:
iostream:从流(读或写)数据 , fstream:从文件(读或写)数据 ,sstream:从string中(读或写)数据,某个流类型前面有'w'表示宽字符的版本。
IO类型之间的关系:
设备类型和字符大小都不会影响执行的IO操作,这是由于继承机制的原因,fstream和sstream都继承iostream,其中cin和cout,fstream和sstream都可以使用。
IO对象无拷贝或赋值:
ofstream out1,out1;//其中o(output)代表输出,f代表文件(file),定义了两个文件输出对象
out1=out2;//错误,你能对流对象赋值
ofstream print(ofstream);//错误不能初始化ofsream参数
out1=print(out1);//错误,不能拷贝流对象
条件状态:
IO操作可以发生一些错误,IO类定义了一些函数和标志,可以帮助我们访问和操作流的条件状态。一个流一旦发生错误,其后续的IO操作都会失败,所以对它的检测是必要的。
#include<iostream>
using namespace std;
int main()
{
int word;
while(cin>>word)
{
cout<<word;
}
return word;
}
输入:1b2
打印:1
看结果就可以知道,当流接收的b的输入时,出错了。word本身只接受int型, 而却输入了char型,则后续的IO都失败了。所以2没有被打印出来
查询流的状态:有时候我们也需要流为什么失败,因为对每个错误的原因,处理方式是不同的。
strm::iostate,strm是一种IO类型,iostate是一种机器相关类型,提供了表达条件状态的完整性
strm::badbit,其表示流已崩溃
strm::failbit,其用来指出一个IO操作失败了
strm::eofbit,其指出流达到了文件结束
strm::goodbit,其指出流为出现错误状态,此值保证为0
badbit表示系统初级错误(如不可恢复的读写错误),一般badbit被置位,流就无法使用了。在发生可恢复性错误后,failbit被置位,这种问题通常是可以 修正的,流还可以继续使用。在到达文件结束位置,eofbit和failbit都会被置位。goodbit的值为0,保证未发生错误。如果badbit,failbit和eofbit任一个被置 位,则检测流状态的条件会失败。
s.eof(),a.fail(),s.bad() ,s.good()这些函数查询这些标志位的状态
s.rdstate() ,返回流s当前的状态,返回值类型为strm::iostate
s.setstate(flags),根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate。返回void
管理条件状态:
流对象的rdstate成员返回一个iostate值,对应流的当前状态。setstate操作将给定条件位置位,表示发生了对应的错误。
管理输出缓冲:
每个输出流都管理一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出操作组合成单一的系统级写操作,由于设备 的写操作耗时,这样可以节约时间。
导致缓冲区刷新:
程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
我们可以使用操作如enndl来显示刷新缓冲区
在每个输出操作之后,我们可以使用操纵符unibuf设置流的内部状态,来情况缓冲区,对cerr是设置unibuf的,因此写到cerr的内容都是立即刷新
一个输出流可能被关联到另一个流。当读写到关联的流时,关联的到流的缓冲区会被立即刷新
flush,ends能像endl一样刷新缓冲区。ends还要向缓冲区插入一个空字符,然后刷新缓冲区。
cout<<"haha"<<endl;//刷新,换换
cout<<"hehe"<<flush;//刷新
cout<<"hoho"<<ends;//输出hoho再加一个空字符,刷新
cout<<unibuf;//所有输出都立即刷新缓冲区
cout<<nounitbuf;//回到正常的缓冲方式
如果程序出现错误,则输出缓冲区不会被刷新