IO库
1. 通用IO类操作
为了支持不同种类的IO处理操作,标准库定义了一些IO类型,分别定义在3个头文件中:iostream定义了用于读写流的基本类型;fstream定义了读写文件的类型;sstream定义了读写内存string对象的类型。
头文件 | 类型 |
iostream | istream 从流读取数据 ostream向流写入数据 iostream读写流 |
fstream | ifstream从文件读取数据 ofstream向文件写入数据 iofstream读写文件 |
sstream | istringstream从string读入数据 ostringstream向string写入数据 stringstream 读写string |
1. IO对象无拷贝和赋值
ofstream out1, out2;
out1 = out2; //错误,不能对流对象进行赋值
ofstream print(ofstream); //错误,不能初始化ofstream参数
out2 = print(out2); //错误,不能拷贝流对象
由于不能拷贝IO对象,因此我们也不能将形参或返回类型设为流类型。进行IO操作的函数通常以引用方式传递和返回流。读写数据
IO对象会改变其状态,因此传递和返回的引用不能是const的。
2. 条件状态
IO类定义了一些函数和标志,可以帮助我们访问和操纵流的条件状态。
IO库条件状态 | |
s.eof() s.fail() s.bad() s.good() s.clear() | 若流的eofbit置位,返回true 若流的failbit或badbit置位,则返回true 若流的badbit置位,则返回true 若流处于有效状态,则返回true 将流s中所有条件状态位复位,将流的状态设置为有效。返回void。 |
3. 管理输出缓冲
每个输出流都有一个缓冲区,用来保存程序读写的数据。有了缓冲机制,操作系统就可以将程序的多个输出组合成单一的系统级写操作,可以带来很大的性能提升。
导致缓冲刷新的原因:
[1].程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
[2].缓冲区满时,需要刷新缓冲,而后的数据才能继续写入缓冲区。
[3].在每个输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。在默认情况下,对cerr是设置unitbuf的,因此写到cerr中的内容都是立即刷新的。
cout << unitbuf; //任何输出操作都立即刷新,无缓冲
cout << nounitbuf; //回到正常的缓冲方式
[4].一个输出流可能被关联到另一个流。在这种情况下,当读写关联的流时,被关联到的流的缓冲区被刷新。例如,默认情况下,cin和cerr都关联到cout,读cin或写cerr都会导致cout的缓冲区被刷新。
[5].显式刷新:endl(输出换行,再刷新缓冲区);flush(直接刷新缓冲区,不附带任何其他字符);ends(输出空字符,然后刷新缓冲区)
2. 文件输入输出
除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件。
fstream特有的操作 | |
fstream fstrm; fstream fstrm(s);
fstream fstrm(s, mode);
fstrm.open(s);
fstrm.close();
fstrm.is_open(); | 创建一个未绑定的文件流 创建一个fstream,并打开名为s的文件。默认的文件模式mode依赖于fstream的类型 按mode打开名为s的文件,s文件绑定到fstrm 打开名为s的文件,并将文件与fstrm绑定。返回void。 关闭与fstrm绑定的文件。返回void。 返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭。 |
*对一个已经打开的文件流调用open会失败,并会导致failbit被置位。随后使用文件流的操作都会失败!
*当一个fstream对象被销毁时,close会自动调用。
文件模式 | |
in out app binary | 以读方式打开 以写方式打开 每次写操作前均定位到文件结尾 以二进制形式进行IO |
3.string流
sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据,就像string是一个IO流一样:
istringstream,ostringstream, stringstream。
stringstream特有的操作 | |
stream strm; stream strm(s);
strm.str(); strm.str(s); | Strm是一个未绑定的stringstream对象 Strm是一个stringstream对象,保存string s的一个拷贝。 返回strm所保存的string的拷贝 将string s拷贝到strm中,返回void。 |