文件模式
每个流都有一个关联的文件模式(file mode),用来指出如何使用文件。表8.4列出了文件模式和它们的含义。
无论用哪种方式打开文件,我们都可以指定文件模式,调用open打开文件时可以,用一个文件名初始化流来隐式打开文件时也可以。指定文件模式有如下限制∶
- 只可以对 ofstream 或 fstream 对象设定 out 模式。
- 只可以对ifstream 或 fstream 对象设定 in 模式。
- 只有当 out 也被设定时才可设定 trunc 模式。
- 只要trunc没被设定,就可以设定 app 模式。在app 模式下,即使没有显式指定 out 模式,文件也总是以输出方式被打开。
- 默认情况下,即使我们没有指定trunc,以out 模式打开的文件也会被截断。为了保留以out 模式打开的文件的内容,我们必须同时指定 app 模式,这样只会将数据追加写到文件末尾;或者同时指定in 模式,即打开文件同时进行读写操作。
- ate和binary 模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用。
每个文件流类型都定义了一个默认的文件模式,当我们未指定文件模式时,就使用此默认模式。与ifstream关联的文件默认以in 模式打开;与 ofstream关联的文件默认以 out 模式打开;与fstream关联的文件默认以in 和 out 模式打开。
以out模式打开文件会丢失已有数据
默认情况下,当我们打开一个 ofstream 时,文件的内容会被丢弃。阻止一个 ofstream 清空给定文件内容的方法是同时指定 app 模式∶
// 在这几条语句中file1都被截断
ofstream out("file1"); // 隐含以输出模式打开文件并截断文件
ofstream out2("file1", ofstream::out); // 隐含地截断文件
ofstream out3("file1", ofstream::out | ofstream::trunc);
// 为保留文件内容,我们必须显式指定app模式
ofstream app("file2", ofstream::app); // 隐含为输出模式
ofstream app2("file2", ofstream::out | ofstream::app);
每次调用open时都会确定文件模式
对于一个给定的流,每次打开文件时,都可以改变文件模式
ofstream out; // 未指定文件打开模式
out.open("scratchpad"); // 模式隐含地设置为输出和截断
out.close(); // 关闭out,以便用于其他文件
out.open("precious", ofstream::app); // 模式为输出和追加
out.close();
第一个open调用未显式指定输出模式,文件隐式地以out 模式打开。
通常情况下,out模式意味着同时使用trunc模式。因此,当前目录下名为scratchpad的文件的内容将被清空。
当打开名为 precious 的文件时,我们指定了append模式。文件中已有的数据都得以保留,所有写操作都在文件末尾进行。