标准库定义了读写文件流的io工具fsteam类,定义在头文件<fstream>中。对于fstream和sstream,它们继承了iostream,因此接口支持iostream时,也支持使用fstream和sstream。
说明: 用fstream代替iostream&:在要求使用基类型对象的地方,我们可以用继承类型的对象来替代。这意味着,接受一个iostream类型引用(或指针)参数的函数,可以传入fstream(或sstream)类型来调用。也就是说,如果有一个函数接受一个ostream&参数,我们在调用这个函数时,可以传递给它一个ofstream对象完成功能,同时调用的虚函数也将变为ofstream的版本,对istream&和ifstream也是类似的,举例:getline(istream, string)在调用时以下用法是正确的getline(ifstrm, s),作用是读取ifstream类型的对象ifstrm绑定的文件中的一行内容存入到字符串s中。
fstream,定义了读写命名文件的类型:
ifstream:从文件中读取数据;ifstream继承fstream;
ofstream:向文件写入数据;ofstream继承fstream;
fstream:既支持读取文件,也支持写入文件。
以上是处理char字符的类型,对于宽字符类型,有wfstream/wifstream/wofstream。
fstream除普通的io操作:如 ofstrm >> s; ifstrm << s; 外,还定义了一些用于管理文件流的特有操作:
fstream fstrm; // 创建一个未绑定的文件流,文件流类型是fstream ;
fstream fstrm(s); // 创建一个fstream对象,并打开名为s的文件(包含扩展名),s是string类型或者C风格字符串的指针。
fstream fstrm(s, mode); // 以指定模式打开文件(读/写,只读,只写)
fstrm.open(s); 打开名为s的文件,返回void;
fstrm.close();// 关闭文件,返回void;
fstrm.is_open(); // fstrm关联的文件是否已打开,已打开返回true;
每个流都有一个关联的文件模式,用于指出如何使用文件。
以下是文件模式的含义:
in | 以读方式打开,ifstream的打开默认使用该模式;只可以对ifstream/fstream指定该模式。例:ifstrm.open("文件名", ifstream::in) |
out | 以写方式打开,但会截断文件(丢弃文件已有内容),ofstream的打开默认使用该模式,只可以对ofstream/fstream指定该模式。 |
app | 每次写操作前,均定位到文件末尾,不会截断文件,需要将内容添加到文件末尾时,应添加该模式,例:ofstrm.open("文件名", ofstream::app) 或 ofstrm.open("文件名", ofstream::out | ofstream::app) |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截断文件(丢弃文件已有内容,将文件大小截断至0),只在out模式下可以选择trunc , 需要使用时应在out的同时添加该模式,例: ofstrm.open(s, ofstream::out | ofstream::trunc) |
binary | 以二进制方式进行IO |