文章目录
第八章 IO库
这张呢怎么说,主要是理解流,其他流操作在具体环境中不会了再查阅文档都没有问题。(可能是我太菜)
8.1 IO类
IO类型间的关系
标准库使我们能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。
ifstream 和 istringstream 都继承自istream , ofstream 和 ostringstream 都继承自ostream所以我们可以像使用istream的方式来使用ifstream和istringstream
8.1.1 IO对象无拷贝或赋值
ofstream out1, out2;
out1 = out2; //错误,不能对流对象赋值
ofstream print(ofstream); //错误,不能初始化ofstream参数
out2 = print(out2); //错误不能拷贝流对象
P279 表: IO库的条件状态
8.1.3 管理输出缓冲
每一个输出流都管理一个缓冲出,用来保存程序的读写数据。这样做有好处,允许操作系统将多个输出操作组合为单一的设备写操作,可以带来很大的性能提升
导致缓冲刷新的原因有很多:
- 程序正常结束,作为main函数的return 操作的一部分,缓冲刷新被执行
- 缓冲区满,需要刷新缓冲,而后新的数据才能继续写入缓冲区
- 通过操作符endl来显示刷新缓冲区
- 每个输出操作之后,我们可以用操纵符unitbuf设置流内部状态,来清空缓冲区在默认情况下,对cerr是设置unitbuf的,因此写到cerr的内容都是立即刷新的
- 一个输出流被关联到另一个流,当读写到被关联的流时,缓冲区会自动刷新。
刷新输出缓冲区
除了endl之外,IO库里面还有两个类似的操纵符
cout << 1 << endl;
cout << 2 << ends;
cout << 3 << fulush;
unitbuf 操纵符
如果想每次输出操作后都刷新缓冲区,我们可以使用unitbuf操纵符。它会告诉流每次写操作之后,都进行一次flush操作,如果想关闭这个功能回到使用unitbuf之前,我们可以使用nounitbuf
cout << unitbuf;
cout << nounitbuf;
如果程序崩溃,输出缓冲区不会被刷新
关联输入和输出流
每一个流操作都会刷新之前流操作的缓冲区
cin.tie(&cout);
ostream *old_tie = cin.tie(nullptr);
cin.tie(&cerr);//不是明智的想法
cin.tie(old_tie);
每个流同时最多关联到一个流,但多个流可以同时关联到同一个ostream
8.2 文件输入输出
P283 表 8.3 fstream特有的操作
8.2.1 使用文件流对象
用fstream 代替iostream
因为fstream 继承于iostream 所以我们在对文件操作的时候,应该用fstream来代替使用iostream
成员函数open和close
我们打开一个文件的时候,不关有没有成功打开。当我们要将一个文件流关联到另一个文件的时候都必须把它close掉
ifstream in(ifile); //构筑一个ifstream并打开给定文件
ofstream out;
out.open(ifile + ".copy"); //打开指定文件
in.close(); // 关闭文件
in.open(ifile + " 2");
自动构造和析构
当一个fstream对象被销毁时,close会自动被调用
8.2.2 文件模式
P286 表:文件模式
- 只能对ofstream 或 fstream 对象设定 out模式
- 只能对ifstream 或 fstream 对象设定in模式
- 当out也被设定才可以设定trunc模式
- 只要trunc没被锁定,就可以设定app模式
- 默认情况下,即使我们没有指定trunc,以out模式打开的文件也会被阶段。为了保留out模式下打开的文件内容,我们必须同时设定app模式
- ate 和 binary 模式可用于任何类型的文件流对象
以out模式打开文件会丢弃已有数据
ofstream out("file1");//隐含以输出模式打开文件并截断文件
ofstream app("file2",ofstream::app);//隐含为输出模式
保留被ofstream打开的文件中已有数据的唯一方法是显式指定app或in模式
每次调用open时都会确定文件模式
ofstream out;
out.open("file1");
out.close();
out.open("flie2", ofstream::app);//模式为输出和追加
out.close();
第一个open , 通常情况下,out模式意味着同时使用trunc模式,一打开文件文件内容就被清空,第二个加了app模式,就代表着在文件末尾继续进行写入操作,保留了原始数据
8.3 string流
P287 表8.5 :stringstream特有的操作
当我们有些工作是对整行文本进行处理,而其他一些工作时处理行内的单个单词,通常使用istringstream
这个内容还没用到,具体用到的时候再具体来学。