8.2 文件输入输出
头文件fstream定义了三个类型来支持文件IO操作。
- ifstream从一个给定文件读取数据;
- ofstream向一个给定文件写入数据;
- fstream可以读写给定文件。
8.2.1 使用文件流对象
要读写一个文件,可以定义一个文件流对象,并将对象与文件关联起来。每个文件流类都定义了一个名为open的成员函数,可以完成一些系统相关的操作,来定位给定的文件,并视情况打开位读或写模式。
创建文件流对象时,可以提供文件名,此时会自动调用open
ifstream in(file); //关联到file文件
ofstream out; //未关联文件
用fstream代替iostream&:在要求使用基类型对象的地方,可以使用继承类型的对象来代替。
成员函数open和close:如果定义了一个空文件流对象,可以调用open来将它与文件关联起来,如果调用open失败,failbit会被置位。
ifstream in(ifile);
ofstream out;
out.open(ifile+".copy");
if (out) //用于检查open是否成功(真)。
一旦文件流与文件关联起来,它会一直保存,此时别的流无法再与该文件绑定,所以有时需要关闭已关联的文件。
in.close();
in.open(ifile+"2");
自动构造与析构:用ifstream类型构造一个对象,如果该对象是一个循环中的局部变量,在每个循环中都要创建和销毁一次。当一个对象离开其作用域时,与之关联的文件会自动关闭,即自动调用close。
8.2.2 文件模式
每个流都有一个关联的文件模式,用来指出如何使用文件。
指定文件时有如下限制:
- 只可以对ofstream或fstream对象设定out模式;
- 只可以对ifstream或fstream对象设定in模式;
- 只有当out也被设定时才可设定trunc模式;
- 只要trunc没被设定,就可以设定app模式。
- 默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断(此时后续添加的数据不会被读入),如果同时指定app模式,会将数据追加写到文件末尾;或同时指定in模式,对文件同时进行读写操作。
- ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
- ifstream关联的文件默认以in打开;ofstream关联的文件默认以out模式打开;fstream默认以in和out打开。
以out模式打开文件会丢弃已有数据:默认情况下打开ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法时同时指定app模式。
//在这几条语句中,file都被截断
ofstream out("file1");
ofstream out2("file1",ofstream::out);
ofstream out3("file1",ofstream::out|ofstream::trunc);
//位保留文件内容,必须显示指定app或in模式
ofstream app("file2",ofstream::app);
ofstream app2("file2",ofstream::out|ofstream::app);
每次调用open时都会确定文件模式:对于一个给定流,每当打开文件时,都可以改变其文件格式。