一、 IO类
1、在IO类中有三个独立的头文件,如下:
iostream
:定义了用于读写流的基本类型fstream
: 定义读写命名文件的类型sstream
: 定义读写内存中string对象的类型
2、IO库类型和文件:
头文件 | 类型 |
---|---|
iostream | istream:从流中读取数据 ostream:向流中写入数据 iostream:读写流 |
fstream | ifstream:从文件中读取数据 ofstream:向文件中写入数据 fstream:读写文件 |
sstream | istringstream:从string 中读取数据 ostringstream:向string 中写入数据 stringstream:读写string |
3、各类型的继承关系
4、不能对IO对象进行拷贝或这赋值
// 正确,可以将初始值与流对象进行绑定初始化
ofstream out1("D:\\Files\\TheFile\\log01.txt");
// 错误,不能对流对象进行赋值
ofstream out2;
out2 = out1;
因为不能进行拷贝流对象,因此不可以将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式来传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能为const
5、IO对象操作的条件状态
在IO操作中一个流一旦发生错误,其上后续的IO操作都会失败。由于流可能会出现错误,因此在使用一个流之前最好要检查它是否处于良好的状态。可以将其当作一个条件来进行使用。
while(cin>>word)
{
//当以上流无错误时才会进行对应的操作。
}
while 循环检查条件中所返回流的状态,如果输入操作成功,流保持有效状态,此时条件为真。
6、输出缓冲管理
(1)、每个输出流都管理一个缓冲区,用来保存程序读写的缓冲数据。如执行 cout<<"hello";
代码,文本可能立刻打印,也可能被操作系统保存到缓冲区中,随后才进行打印。有了设备缓冲机制,操作系统就可以将多个输出操作组合成单一的系统级写操作。由于设备的写操作会很耗时,这样的操作可以大大的提高系统的性能。
(2)、导致缓冲刷新的主要原因如下:
- 程序正常结束时,缓冲被刷新。
- 缓冲区满时,需要刷新缓冲,才能将新的数据写入到缓冲区
- 可以使用endl来显式的刷新缓冲区。
- 可以使用操作符unitbuf来设置内部流状态,清空缓冲区。默认情况下对cerr是设置unitbuf的,因此写到cerr中的内容是立刻被刷新的。
- 一个输出流可能会被关联到另一个流,这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。如默认
cin
和cerr
都关联到cout
。因此读cin
或写cerr
都会导致cout
的缓冲区被刷新。
(3)、IO库中有三个操纵符:endl
、flush
、ends
。其中endl刷新缓冲区并换行;flush刷新缓冲区,但是不输出任何额外字符;ends向缓冲区中插入一个空字符,然后刷新缓冲区。
cout << "hi" << endl; //输出hi和一个换行符,然后刷新缓冲区
cout << "hi" << flush; //输出hi,然后刷新缓冲区,不附加任何额外字符
cout << "hi" << ends; //输出hi和一个空格,然后刷新缓冲区
(4)、unitbuf 操纵符。如果向每次输出操作后都刷新缓冲区,可以使用 unitbuf。它在接下来的每次写操作之后都进行一次flush
操作。而nounitbuf则重置流,使其恢复之前的状态。
//所有输出操作后都立即刷新缓冲区
cout<<unitbuf;
//回到正常缓冲方式
cout<<nounitbuf;