利用文件流操作打开一个文件,只需要建立一个对象,它的构造函数负责打开文件,当该对象生存期结束时,它会调用析构函数关闭文件。当然,我们也可以调用成员函数open()和close()进行文件的打开和关闭,下面这个例子说明了如何用文件流进行文件操作。
文件流类其实是输入输出流类的一部分,由于在实际中,会经常用到文件操作,所以我们把文件流类再单独介绍。
一、打开文件
用文件流打开文件可以利用无参的构造函数,然后调用open():
ofstream outfile;
outfile.open("outfile", iosmode);
也可调用带参数的构造函数,指定文件名和打开方式:
ofstream outfile("outfile", iosmode);
文件打开方式由下面几种:
|
| 表12-7 |
|
ios::in | 打开一个输入文件,用这个标志作为ifstream的打开方式,以防止截断一个现成的文件 | ios::out | 打开一个输出文件,当用于一个没有ios::app、ios::ate或ios::in的ofstream时,ios::trunc被隐含 | ios::app | 以追加的方式打开一个输出文件 | ios::ate | 打开一现成文件(不论是输入还是输出)并寻找末尾 | ios::nocreate | 仅打开一个存在的文件(否则失败) | ios::noreplace | 仅打开一个不存在的文件(否则失败) | ios::trunc | 如果一个文件存在,打开它并删除旧的文件 | ios::binary | 打开一个二进制文件,缺省的是文本文件 |
|
|
这些标志可以通过逐位或(|)运算来连接。
ios类中定义的文件打开方式:
|
| 程序12-15 |
| // stream operation mode enum open_mode { in = 0x01, // open for reading out = 0x02, // open for writing ate = 0x04, // seek to eof upon original open app = 0x08, // append mode: all additions at eof trunc = 0x10, // truncate file if already exists nocreate = 0x20, // open fails if file doesn't exist noreplace= 0x40, // open fails if file already exists binary = 0x80 // binary (not text) file }; |
|
它们可以用逐位或(|)运算符来连接。例如,下面的语句用来打开一个文件用于输出,并确保它以前是不存在的:
ofstream outfile("outfile", ios::out|ios::noreplace);
当文件打开失败时,文件流对象的bad标志会置位。可以使用ios类成员函数clear清除标志位,然后重新操作。
|
二、文件操作 由于iostream的设备无关性,构造了文件流以后,就可以象前面标准输入输出流的方法一样使用了。 三、关闭文件 在文件操作结束时,可以用close()成员函数关闭该文件。 Outfile.close(); 不过,在该文件流对象生存期结束时,对象也会自动调用析构函数来关闭文件。最好在文件操作结束时,关闭文件,这样会使程序的可读性更好。
|
| 程序12-16 |
| outfile<<"hello world"<<name<<endl; infile>>pi>>a>>complex; outfile.write(buf,80); infile.getline(buf,80); |
|
需要注意的是:文件操作不能超过该文件打开方式设定的权限。
如果查看fstream.h,可以会发现:类ifstream和ofstream仅仅定义了一些必要的构造函数、open()和close()。这说明它们继承了istream和ostream负责具体操作的成员函数。也就是说,文件操作和前面讲的标准流操作是完全一样的。但是,如果文件操作超过该文件打开方式设定的权限,比如试图向一个输出文件流中输入数据,那么该文件流的bad标志会置位。