IO即 Input和Output, C++通过一组定义在标准库类型中的类型处理IO, IO的目标对象可以是设备(文件, 控制台窗口等)或者内存(string类型).
- IO库类型有哪些?
- iostream头文件下定义的IO类型
- istream, wistream: 从流中读取数据
- otream, wostream: 向流中写入数据
- iostream, wiostream: 读写流
- fstream头文件下定义的IO类型
- ifstream, wifstream: 从文件读取数据
- ofstream, wofstream: 向文件写入数据
- fstream, wfstream: 读写文件
- sstream头文件下定义的IO类型
- istringstream, wistringstream: 从string读取数据
- ostringstream, wostream: 向string写入数据
- stringstream, wstringstream: 读写string
- iostream头文件下定义的IO类型
w前缀表示支持宽字符集
- IO类的继承机制
简单说ifstream和istringstream都继承自istream, 也就是, 可以使用istream的地方就可以使用ifstream和istringstream替代, 但是可以用ifstream和istringstream的地方不可以用istream替代, 对输出流也有同样的继承关系.
可以将文件和string理解为一种特殊的流.
- 流的状态(条件状态)
IO操作是可能出错的, 所以我们需要知道流的状态, 称为条件状态. 流的状态以及查询设置流的状态的内容不再赘述.
- 管理输入输出缓冲区
每一个输出流都管理一个输出缓冲区, 数据可能暂时存储在该缓冲区中, 直到缓冲区被刷新才会被真正写到要输出的设备或文件中.
缓冲区在以下情况下会被刷新:
- 程序正常结束, return操作中缓冲区会被刷新
- 缓冲区满时
- 使用endl ends flush等操纵符显式的刷新
- 使用unitbuf设置流的内部状态为立即刷新, 则每个输出操作后缓冲区都会立即刷新
- 一个输出流可以被关联到其他流, 当读写与输出流关联的流时都会导致输出流缓冲区的刷新
- endl ends flush的区别
- endl: 向缓冲区末尾添加一个换行符, 然后刷新缓冲区
- ends: 向缓冲区末尾添加一个空字符, 然后刷新缓冲区
- flush: 直接刷新缓冲区
- 文件模式
每一个流都有一个与之关联的文件模式, 以表明该流如何使用文件
文件模式包括:
- in: 以读的方式打开
- out: 以写的方式打开
- app: 每次写操作均定位到文件末尾
- ate: 打开文件后立即定位到文件末尾
- trunc: 截断文件
- binary: 以二进制方式进行IO
不再赘述.