iostream istream,ostream ,iostream
fstream ifstream,ofstream, fstream
sstream sstringstream,ostringstream,stringstream
为了支持宽字符wchar_t,在函数和类型名前加w,wcin,wistream
我们不能拷贝或对IO对象赋值,进行IO操作的函数通常以引用方式传递和返回流,读写时会改变其状态,因此传递和返回的引用不能使const的
条件状态:
strm::iostate strm是一种IO类型,iostate是一种机器相关的类型,提供了表达条件状态的完整功能,有以下四个值,枚举类型
strm::badbit 用来指出流已崩溃 发生错误后流无法再使用,
strm::failbit 用来指出一个IO操作失败了,如期望出现数值却读的是char,错误后流还能使用
strm::eofbit 用来指出流到达了文件结束
strm::goodbit 用来指出流未处于错误状态,此值保证为零。
s.eof() 若流s的eofbit位置,则返回true
s.fail() 若流s的failbit或badbit位置,则返回true
s.bad() 若流s的badbit位置,则返回true
s.good() 若流s处于有效状态,则放回true
s.clear(flags) 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate.返回void
s.setstate(flags) 根据给定的flags标志位,将流s中对应条件状态位置位。flags的类型为strm::iostate 返回void,表示发生对应的错误
s.rdstate() 返回流s的当前状态,返回状态位strm::iostate
文件结束eofbit和failbit会被置位
我们将流当做条件使用的代码就等于!fail()。而eof和bad操作只能表示特定的错误
为了复位单一的条件状态,我们首先用rdstate读出当前条件状态,然后用位操作将所需位复位来生成新的状态。例如:
下面的代码将failbit和badbit复位,但保持eofbit不变
cin.clear(cin.rdstate() & ~ cin.failbit & ~ cin.badbit);
每个输出流都管理一个缓冲区,用来保存程序读写的数据。如下情况刷新缓冲区
程序真正的结束,作为main函数的return操作的一部分,缓冲刷新被执行
缓冲区满,只有刷新新数据才能进来
endl显式刷新
在每个输出操作之后,我们可以用操纵符unitbu设置流内部状态,来清空缓冲区。默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流是,关联到的流的缓冲区会被刷新。如,默认情况下,cin和cerr都关联到cout,因此,读cin或写cerr都会导致cout的缓冲区被刷新
cout<<"hi!"<<endl;//输出hi和一个换行,然后刷新缓冲区
cout<<"hi!"<<flush;//输出hi,然后刷新缓冲区,不附加任何额外的信息
cout<<"hi!"<<ends;//输出hi和一个空字符,然后刷新缓冲区
cout<<unitbuf;//所有输出操作之后都会立即刷新缓冲区
//任何输出都立即刷新,无缓冲
cout<<nounitbuf; //回到正常的缓冲方式
如果程序崩溃,输出缓冲区不会被刷新,输出数据被挂起没有打印
当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流
tie有俩个版本,不带参数,返回对象关联流的指针,如果无关联输出空指。带参数的版本,接受一个ostream指针将自己关联到此ostream
我们既可以将一个istream对象关联一个ostream,也可以将一个ostream关联到另一个ostream
cin.tie(&cerr); //读取cin会刷新cerr而不是cout
除了继承自iostream类型的行为之外,fstream还定义了自己的成员
fstream fstrm; 创建一个未绑定的文件流
fstream fstrm(S); 创建一个fstream,并打开s的文件。s可以使string类型或者是一个指向c风格的字符串的指针,这些构造函数都是explicit
fstream fstrm(s, mode); 与前一个构造函数类似,但按指定mode打开
fstream.open(s); 打开名为s的文件,并将文件与fstrm绑定。默认的人间mode依赖于fstream的类型,返回void
fstrm.close() 关闭文件绑定,返回void
fstrm。is_open() 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
如果open成功,则open()会设置流的状态吧,使得good()为true;
当一个fstream对象被销毁时,close会自动被调用
in 打开文件做读操作
out 打开文件做写操作
app 在每次写之前找到文件尾
ate 打开文件后立即将文件定位在文件尾
trunc 打开文件时清空已存在的文件流
binary 以二进制模式进行 IO 操作
out 打开文件做写操作,删除文件中已有的数据
out | app 打开文件做写操作,在文件尾写入
out | trunc 与 out 模式相同
in 打开文件做读操作
in | out 打开文件做读、写操作,并定位于文件开头处
in | out | trunc 打开文件做读、写操作,删除文件中已有的数据
文件模式
out模式打开的文件会丢失已有数据,保留ofstream打开文件中已有数据的唯一方法是显示指定opp或in
close()重新 open()会重新确定文件模式
stringstream特有的操作
sstream strm
sstream strm(s)
strm.str() 返回strm所保持的string的拷贝
strm.str(s) 将string s拷贝到strm中,放回void