<fstream>库包含了三个基本的类:ifstream, ofstream和fstream。这三个类分别代表一个输入文件,一个输出文件,以及一个输入输出文件。Ifstream类支持>>操作符,ofstream类支持<<操作符,fstream类同时支持>>和<<操作符。所有<fstream>对象都能够把一个文件名当成构造函数的变量,并能够自动的打开文件,如:
std::ofstream dictionary(“myfile.txt”);
<fstream>类的析构函数自动地添加清除文件内容并关闭文件,所以当你忘记关闭文件时也无大碍。如果在构造函数中不提供一个文件名,可以通过调用open()成员方法来打开文件,如下所示:
std::ofstream dictionary;
dictionary.open(“myfile.txt”);
dictionary.close(); //explicit
为了能演示<fstream>库的强大功能,我们先看看一个具体的范例。表A包含了一个程序,程序的功能为:生成了一个名为dictionary的ifstream对象,打开一个名为dict.txt的文件,以及在屏幕上打印每一个字。
相对于典型的<stdio.h>程序,这个程序要简单得多了。第一,在每一次读取操作着无需检查EOF(end of file)。<fstream>类执行!操作符,如果产生错误,!操作符的值即为原值的相反。我们可以利用这一特点来检查文件是否正确的打开。第二,While循环也使用这一操作符来检查文件的状态。最后,当程序结束时,dictionary对象的析构函数会自动地关闭文件。
如果你不具体指明文件的打开模式,fstream类会使用缺省模式。例如,ifstream在缺省情况下会以读的模式打开一个文件,并把文件指针定在文件的起始处。同样的,ofstream在缺省情况下也是以读的模式打开一个文件。你可以通过使用OR操作符设置多个标记,如下所示:
ofstream logfile("login.dat", ios::binary|ios::app);
表B包含了一系列的文件打开模式和文件属性。
<fstream> 和<fstream.h>
<fstream.h>支持ios::nocreate和ios::noreplace标记。<fstream>库不支持这些标记。然而,这篇文章讲述了如何很容易地仿制它们的功能。