8. IO库
i读o写
8.1 IO类
- iostream定义了用于读写流的基本类型;
- fstream定义了读写命名文件的类型;
- sstream定义了读写内存string对象的类型;
宽字符版本的类型和函数的名字以一个w开始。
8.1.1 IO对象无拷贝或赋值
不能拷贝或对IO对象赋值,也不能将形参或返回类型设置为流类型,IO操作通常以引用方式传递和返回流。读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的。
8.1.2 条件状态
查询流的状态:auto state = cin.rdstate();
为了在使用一个流之前检查它是否处于良好状态:
8.1.3 管理输出缓冲
导致缓冲刷新(数据真正写到输出设备或文件)的原因:
- 程序正常结束,作为main函数的return操作的一部分;
- 缓冲区满,刷新缓冲后新的数据才能继续写入缓冲区;
- 使用endl显式刷新缓冲区;
- ......
8.2 文件输入输出
fstream定义了三个类型支持文件IO:
- ifstream从一个给定文件读取数据;
- ofstream向一个给定文件写入数据;
- fstream读写给定文件;
8.2.1 使用文件流对象
如果提供了一个文件名,open会自动被调用。定义一个输入流in,文件名由string类型的参数ifile指定(也可以时C风格字符数组)。定义一个输出流out不与任何文件关联,随后调用open将它与文件关联起来。
由于调用open可能失败,最好检测一下open是否成功:
8.2.2 文件模式
无论用哪种方式打开文件(用open打开文件、用一个文件名初始化流隐式打开文件)都可以指定文件模式:
以out模式打开文件会丢弃已有数据,组织一个ofstream清空给定文件内容的方法是同时指定app模式:
每次调用open时都会确定文件模式,对于一个给定流每当打开文件时,都可以改变其文件模式:
8.3 string流
sstream定义了三个类型支持内存IO,就像是string是一个IO流一样:
- istringstream从string读取数据;
- ostringstream向string写入数据;
- stringstream可以读写数据;
8.3.1 使用istringstream
假定有一个文件列出了一些人和他们的电话号码:
首先定义一个类描述输入数据:
程序用于读取数据文件并创建一个PersonInfo的vector,vector中每个元素对应文件中的一条记录:
8.3.2 使用ostringstream
此程序中假定已有两个函数valid和format,分别完成电话号码验证和改变格式的功能。