14.8.2 文件的打开

    在C++中打开一个文件,就是建立一个文件的输入输出流,并将文件和流关联起来,而关闭一个文件,就是取消这种关联,首先来看以下流的建立过程。

    建立流的过程就是定义流类的对象,如下所示。


    ifstream in; ofstream out; fstream io;

    上述代码分别定义了输入流对象in、输出流对象out和输入/输出流对象io。

    接下来,需要将流对象和特定的文件关联起来,使用open函数打开文件是一种常用的方法,open函数的原型是在fstream中定义的,在ifstream,ofstream和fstream类中均有实现,其原型如下所示。


    void open(const char*,ios_base:openmode);第1个参数传递的是文件名,openmode是在ios_base类中定义的一个类型,用于表示模式,其定义格式如下所示。 enum openmode { in=0x01,//打开文件,以便从文件中读取 out=0x02,//打开文件,以便向文件中输出 ate=0x04,//打开文件,并移到文件尾 app=0x08,//输出追加到文件尾 trunc=0x10,//删除同名文件 binary=0x20//文件以二进制形式打开,无效时默认为文本文件 };

    旧的C++标准中<fstream.h>头文件中还定义了常量nocreate和ios:noreplace,但新的<fstream>库已经取代了<fstream.h>,不再支持这两个标志。

    同前面格式状态字和流状态字类似,openmode中定义的这些枚举常量也分别对应着模式字的某个位,使常量有效即是使其对应位为1,因此,你可以用位或操作符“|”组合这些标志,如下所示。


    ofstream logfile; logfile.open("login.txt",ios_base:out|ios_base:trunc);fstream类型对象同时支持读和写操作,可以写成如下形式。 fstream logfile; logfile.open("database.txt",ios_base:in|ios_base:out);

    表14.3中介绍了高层I/O中fopen函数的模式,流类库与高层I/O文件打开模式的对比如表14.10所示。

    14.8.2 文件的打开 - 图1

    默认情况下,常量ios_base:binary无效,即其对应位为0,对应着高层I/O中的“t”模式,处理的是文本文件,如果处理的是二进制文件,只要在模式中置ios_base:binary有效即可,对应着“b”模式。

    除了使用open函数外,在创建流时可以直接调用构造函数完成其和某个文件的关联,举例如下所示。


    ofstream logfile("login.txt",ios_base:out|ios_base:trunc); fstream logfile("database.txt",ios_base:in|ios_base:out);

    其接收的参数同样有两个:const char*和ios_base:openmode。这同open函数中的用法完全一致。

    流对象的构造函数和open函数对第2个参数openmode提供了默认值,ifstream的openmode默认为ios_base:in,ofstream默认为ios_base:out|ios_base:trunc,fstream类不提供默认openmode值,因此,在创建fstream类对象时,必须显式指明第2个参数。

    新的C++流类库提供了is_open成员函数来判断流和文件是否正确地关联,如下所示。


    ofstream logfile("login.txt",ios_base:out|ios_base:trunc); if(logfile.is_open()) { …… }

    如果成功关联,is_open函数返回true,否则返回false。

    还可以利用流状态的相关信息对文件和流是否关联成功进行判断,如logfile.good()等,但这种方式容易对某些关联失败产生漏判和误判,因此这里便不再赘述,推荐采用is_open函数进行判断。