第八章 深入IO
第1节 序
第2节 IOStream概述
流式IO而非记录IO
处理的主要问题
- 表示形式的变化:使用格式化/解析在数据的内部表示与字符序列之间切换
- 与外部设备的通信:针对不同的外部设备引入不同的处理逻辑
涉及到的操作
- 格式化/解析
- 缓存
- 编码转换
- 传输
采用模板来封装字符特性,采用继承来封装设备特性
- 常用类型实际上是类模板实例化的结果
第3节 输入和输出
分为格式化和非格式化两类
非格式化:不涉及数据表示形式的变化
- 常用输入函数:
get/read/getline/gcount
- 常用输出函数:
put/write
格式化:使用移位操作符进行的输入输出
第4节 文件与内存操作
文件操作
-
basic_ifstream/basic_ofstream/basic_fstream
std::ofstream outfile("my_file"); outfile << "Hello\n";
-
文件流可以处于打开、关闭状态
std::ofstream outfile; outfile.open("my_file");
意义明确的打开方式组合
内存流:basic_istringstream/basic_ostringstream/basic_stringstream
也会受打开模式的影响:in/out/ate/app
使用.str()
方法获取底层所对应的字符串
基于字符串流的字符串拼接优化操作(优于直接拼接string,避免内存的刷新)
第5节 流的定位、同步和状态
流的状态
iostate
- badbit 不可恢复的流错误
- failbit 输入输出操作失败(可恢复)
- eofbit 关联的输出序列已达文件尾 (Ctrl+D/C)
检测流的状态
std::cout<<std::cin.good();
注意区分fail和eof
获取流的位置
- tellg()/tellp() 用于获取输入/输出流的位置(pos_type类型)
- 失败时返回(-1)
设置流的位置
- seekg()/seekp()用于设置输入/输出流的位置