一、 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;
本文详细介绍了C++标准库中的IO流概念,包括iostream、fstream和sstream三个核心头文件的功能和用途,阐述了流对象的使用限制、条件状态检查、缓冲区管理及刷新机制,并解释了如何正确初始化和使用流对象。
1754

被折叠的 条评论
为什么被折叠?



