8.2.2 文件模式

每个流都有一个关联的文件模式,用来指出如何使用文件。

文件模式 -
in 以读方式打开
out 以写方式打开
app 每次写操作前均定位到文件末尾
ate 打开文件后立刻定义到文件末尾
trunc 截断文件
binary 以二进制方式进行IO

指定文件模式有如下限制:

  1. 只可对ofstream或fstream对象设定out模式。
  2. 只可对ifstream或fstream对象设定in模式。
  3. 只有当out也被设定时才可设定trunc模式。
  4. 只要trunc没被设定,就可以设定app模式。在app模式下,及时没有显示指定out模式,文件也总是以输出模式被打开。
  5. 默认情况下,及时没有指定trunc,以out模式打开的文件也会被阶截断。为了保留以out模式打开的文件的内容,我们必须同时指定app模式,这样只会将数据追加写到文件末尾,后者同时指定in模式,打开文件同时进行读写操作。
  6. ate和binary模式可用于任何类型的文件流对象,且可以与其他文件模式组合使用。

每个文件流类型都定义了一个默认的文件模式,与ifstream关联的文件默认以in模式打开,与ofstream关联的文件默认以out模式打开,与ifstream关联的文件默认以in和out模式打开,

  • 以out模式打开数据会丢失已有数据 默认情况下,当打开一个ofstream时,文件的内容会被丢弃。阻止一个ofstream清空给定文件内容的方法是同时指定app模式。
ofstream out("file"); //隐含以输出模式打开文件并截断文件
ofstream out2("file1", ofstream::out); //隐含的截断文件
ofstream out3("file1", ofstream::out | ofstream::trunc);
ofstream app("file2", ofstream::app); //隐含为输出模式
ofstream app2("file2", ofstream::out | ofstream::app); 

保留被ofstream打开的文件中已有数据的方法是显示指定app或in模式。

  • 每次调用open时会确定文件模式
ofstream out; //未指定文件打开模式
out.open("file"); //模式隐含设置为输出和截断
out.close();
out.open("file", ofstream::app); //模式为输出和追加
out.close();