C++ 学习笔记(8)IO库
参考书籍:《C++ Primer 5th》
API:std::iostream
8.1 IO类
8.1.1 IO对象无拷贝或赋值
- 不能拷贝或对IO对象赋值,通常用引用来操作。
- 读写IO对象会改变其状态,所以传递或返回的引用不是const的。
ofstream out1, out2;
out1 = out2; // 错误。不能对流对象赋值
ofstream print(ofstream); // 错误。不能初始化ofstream参数
out2 = printf(out2); // 错误。不能拷贝流对象
8.1.2 条件状态
- badbit:系统级错误,如不可恢复的读写错误。置位后,流就无法使用。
- failbit:可恢复错误,如读取数值时读出错误字符。
- 达到文件结束位置时,eofbit 和 failbit 都会被置位。
8.1.3 管理输出缓冲
- 每个输出流都管理一个缓冲区,用来保存程序的读写数据。
- 导致缓冲刷新(数据真正写到输出设备或文件)原因:
- 程序正常结束,作为main函数return操作的一部分,刷新缓冲。
- 使用endl、flush、ends显式刷新。
- 使用操纵符unitbuf设置流状态(每次输出操作后都刷新),默认情况下cerr是unitbuf的。
- 一个流被关联到另一个流。读写流会让被关联的流缓冲区刷新。默认cin和cerr都关联cout,即读cin或写cerr都会导致cout缓冲区刷新。
cout << "a" << endl; // 输出a和换行,然后刷新缓冲区
cout << "a" << flush; // 输出a,刷新缓冲区
cout << "a" << ends; // 输出a和空格,属性缓冲区
cout << unitbuf; // 开启每次输出后就flush
// 所有输出操作后都会立即更新
cout << nounitbuf; // 关闭
- 关联流使用 tie 函数。
- 每个流同时最多关联到一个流,但多个流可以同时关联到同一个ostream。
8.2 文件输入输出
8.2.1 使用文件流对象(ifstream、ofstream、iofstream)
- 使用open打开指定文件后,文件流和文件就保持关联。要关联另一个文件时,要先close关闭已经关联的文件。
- 当fstream对象被销毁时,close会自动调用。
8.2.2 文件模式
- app:append,默认以写的方式打开。ate:at end,默认以读的方式打开。如果打开文件不存在,app会生成这个文件,ate会打开失败。
- trunc:truncated,舍弃流的内容。
- ofstream 对象只能设定 out 模式。
- ifstream 对象只能设定 in 模式。
- 只有 out 被设定时才能用 tructc 模式。
- 默认 out 模式打开文件也会被截断,要保留文件内容应该同时用app,或者用in。
- ate 和 binary 模式可以用于任何类型的文件流对象。
8.3 string流
小结
- iostream 处理控制台IO
- fstream 处理命名文件IO
- stringstream 完成内存string 的IO
- fstream 和 stringstream都继承至iostream。同理istream、ostream也是其基类。