文件的打开与关闭
学习文件操作之前首先要了解最基本的文件操作,文件的打开与关闭。下面将针对文件的打开与关闭进行详细地讲解。
1、打开文件
操作文件之前首先要打开文件,不打开文件就不能对其进行读写。C++提供两种打开文件的方式:调用文件流的成员函数open()、调用文件流的构造函数打开文件。
用文件流的构造函数打开文件,就是在构造文件流对象时传入指定的文件,在上一节中已经讲述,而本节主要讲解open()成员函数。
ifstream类、ostream类和fstream类都提供了成员函数open()用于打开文件,其格式如下所示:
void open(const char* filename, int mode, int prot = filebuf::openprot);
第一个参数filename是要打开文件的文件名;第二个参数表示文件打开的方式;第三个参数是文件打开时的保护方式,该参数与操作系统有关,通常默认值为filebuf::openprot。
如果文件打开失败,open()函数执行后流对象的值为0(假);如果是调用构造函数来打开文件失败,则流对象的值为0,可以据此测试文件打开是否成功。
文件的打开方式有多种,例如以输入方式打开文件、以输出方式打开文件,文件打开方式都是在ios类中定义的,具体如表1所示。
表1 文件打开模式
文件打开模式 | 说明 |
---|---|
ios::in | 以输入方式打开文件; |
ios::out | 以输出方式打开文件,若文件不存在,则创建;若存在,则清空文件; |
ios::app | 以输出方式打开文件,用于在文件尾追加数据; |
ios::ate | 打开一个现存文件(输入或输出)并查找到结尾; |
ios::trunc | 打开一个文件,如果文件已存在,则删除其中全部数据,如文件不存在,则建立新文件。如已指定了 ios::out 方式,而未指定ios: :app,ios::ate,ios: :in,则同时默认此方式; |
ios::binary | 以二进制方式打开文件,不指定则默认为ASCII方式; |
ios::nocreate | 打开一个已有文件,若不存在则打开失败;总与in或out结合使用; |
ios::noreplace | 创建一个新文件,若文件已存在则创建失败;通常与out方式结合使用; |
这些文件打开方式通常可组合搭配使用,用“位或”运算符对输入输出方式进行组合。例如下面代码:
ofstream ofs;
ofs.open("Hello.txt", ios::in|ios::out|ios::binary)
对于ifstream类对象其打开文件的默认方式是ios::in,ostream类对象打开文件的默认方式是ios::out,fstream类对象默认打开方式为ios::in|ios::out。
2、关闭文件
打开文件并对文件操作结束后要关闭文件。关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。C++中ifstream类、ostream类和fstream类都提供了一个成员函数close()用于关闭~~打开~~文件,其格式如下所示:
void close();
对于ofstream类来说,析构函数会自动完成关闭,但如果需要在同一个流上打开另外的文件,就需要使用close()函数了。例如下面的代码:
ofstream ofs;
ofs.open("file1"); //打开file1文件
ofs.close(); //关闭file1文件
ofs.open("file2"); //关闭file1文件后,再打开file2文件
ofs.close();
学习完文件的打开和关闭操作后,就可以开始对文件的具体操作进行学习了。接下来通过一个简单案例来学习一下文件的打开和关闭操作。
先在桌面上建立一个a.txt文件,如图1所示。
图1 a.txt文件内容
以后如无特殊说明,本书在建立读写文件时均指在桌面创建,读者也可在程序根目录下创建,接下来编写打开关闭文件的代码,如例1所示。
例1
1 #include <iostream>
2 #include <fstream> //包含fstream头文件
3 using namespace std;
4 int main()
5 {
6 ifstream ifs; //构造输入流
7 ifs.open("C:\\Users\\www\\Desktop\\a.txt", ios::in); //以输入方式打开
8 if (!ifs)
9 cout << "open failed" << endl;
10 else
11 cout << "open success" << endl;
12 ifs.close();
13 system("pause");
14 return 0;
15 }
运行结果如图2所示。
图2 例1运行结果
由图2所知,文件打开成功。在操作文件结束后要调用close()函数关闭文件。