第08章_IO库
IO 类
- iostream 定义了用于读写流的基本类型, fstream 定义了读写命名文件的类型, sstream 定义了读写内存 string 对象的类型
- 为了支持使用宽字符的语言, 标准库定义了一组类型和对象来操作 wchar_t 类型的数据. 宽字符版本的类型和函数的名字以一个 w 开始(wcin, wcour, wcerr)
- ifstream 和 istringstrean 都继承自 istream. 因此, 可以像使用 istream 对象一样来使用 ifstream 和 istringstream 对象
IO 对象无拷贝或赋值
- 不能将形参或返回类型设置为流类型, 进行 IO 操作的函数通常以引用方式传递和返回流
- 读写一个 IO 对象会改变其状态, 因此传递和返回的引用不能是 const 的
条件状态(未完成)
- 一个流一旦发生错误, 其上后续的 IO 操作都会失败.
- 只有当一个流处于无错误状态时, 才可以从它读取数据
1
while(std::cin >> word) {} // 读取应该判断状态
管理输出缓冲
- 每个流都管理一个缓冲区, 用来保存程序读写的数据.(有了缓冲机制, 操作系统就可以将程序的多个输出操作组合成单一的系统级操作)
- 导致缓冲刷新的原因
- 程序正常结束, 作为 main 函数的 return 操作的一部分, 缓冲刷新被执行
- 缓冲区满时, 需要刷新缓冲区, 而后新的数据才能继续写入缓冲区
- 可以使用操纵符 endl 来显示刷新缓冲区
- 在每个输出操作之后, 可以用操纵符 unithub 设置流的内部状态, 来清空缓冲. 默认情况下, 对 cerr 是设置 unitbuf 的, 因此写到 cerr 的内容都是立即刷新的
- 一个输出流可能被关联到另一个流(流关联: 确保一个流在另一个流执行输出操作前先刷新(flush),避免数据输出顺序混乱). 在这种情况下, 当读写被关联的流时, 关联到的流的缓冲区会被刷新.(默认情况下, cin 和 cerr 都关联到 cout, 因此, 读 cin 或 写 cerr 都会导致 cout 的缓冲区被刷新)
- 如果程序崩溃, 输出缓冲区不会被刷新
- 当一个输入流被关联到一个输出流时, 任何试图从输入流读取数据的操作都会先刷新关联的输出流(标准库将 cout 和 cin 关联在一起)
- 交互式系统通常应该关联输入流和输出流(这样所有输出, 包括用户提示信息, 都会在读操作之前被打印出来)
文件输入输出
使用文件流对象
- 当一个 fstream 对象被销毁时, close 会自动被调用
文件模式
- in: 以读方式打开
- out: 以写方式打开
- app: 每次写操作前均定位到文件末尾
- ate: 打开文件后立即定位到文件末尾
- trunc: 截断文件
- binary: 以二进制方式进行 IO
- 在每次打开文件时, 都要设置文件模式, 可能是显式地设置, 也可能是隐式地设置. 当程序未指定模式时, 就使用默认值
- 与 ifstream 关联的文件默认以 in 模式打开
- 与 ofstream 关联的文件默认以 out 模式打开
- 与 fstream 关联的文件默认以 in 和 out 模式打开
string 流
- istringstream 从 string 读取数据, ostringstream 向 string 写入数据, 而 stringstream 既可以从 string 读数据也可向 string 写数据