C++打开文件的2种方式(附带实例)
在对文件进行读、写操作前,先要打开文件。打开文件的目的有两个:
打开文件的方式有两种:
因此,调用流对象的 open() 成员函数打开文件的语法形式如下:
下表中列出了各种模式标记单独使用或组合使用时的作用。
调用 open() 成员函数时,给出的文件名可以是绝对路径,如 c:\\tmp\\test.txt;也可以是相对路径,即只给出文件名,如 test.txt,此时程序会在当前文件夹(也就是可执行程序所在的文件夹)中寻找要打开的文件。
例如,打开 test.txt 文件,进行写操作,代码如下:
使用相对路径打开文件 test.txt,进行写操作,代码如下:
使用绝对路径打开文件 test.txt,进行写操作,代码如下:
当不再对打开的文件进行任何操作时,应及时调用 close() 成员函数关闭文件。
【实例】创建两个文件 test.txt 和 test2.txt,向文件写入字符串,代码如下:
如果文件夹内有 test.txt 文件和 test2.txt 文件,则覆盖原有文件内容。
- 通过指定文件名,建立起文件和文件流对象间的关联。以后对文件进行操作时,就可以通过关联的流对象进行。
- 指明文件的使用方式。使用方式有只读、只写、既读又写、在文件末尾添加数据、以文本方式使用、以二进制方式使用等多种。
打开文件的方式有两种:
- 调用流对象的 open() 成员函数打开文件;
- 定义文件流对象时,通过构造函数打开文件。
open()打开文件
以 ifstream 类为例,该类有一个 open() 成员函数,其有两个参数,第一个参数是指向文件名的指针,第二个参数是文件的打开模式标记。其他两个文件流类也有同样的 open() 成员函数。因此,调用流对象的 open() 成员函数打开文件的语法形式如下:
<文件流对象名>.open(<文件名>,<打开模式>);
- 文件流对象名是一个已经定义的文件流对象;
- 文件名指磁盘文件的名称,包括磁盘文件的路径;
- 打开模式指明了文件的使用方式,这些标记可以单独使用,也可以组合使用。
下表中列出了各种模式标记单独使用或组合使用时的作用。
打开模式 | 适用对象 | 作用 |
---|---|---|
ios::in | ifstream fstream | 打开文件,以读取数据。如果文件不存在,则打开出错 |
ios::out | ofstream fstream | 打开文件,以写入数据。如果文件不存在,则新建该文件;如果文件存在,则打开时清除原有的内容 |
ios::app | ofstream fstream | 打开文件,在尾部添加数据。如果文件不存在,则新建该文件 |
ios::ate | ifstream ofstream fstream | 打开已存在的文件,将文件读指针指向文件末尾。如果文件不存在,则打开出错 |
ios::trunc | ofstream | 打开文件时,清空存储的所有数据(单独使用时与 ios::out 相同) |
ios::binary | ifstream ofstream fstream | 以二进制方式打开文件。若不指定此模式,则以文本模式打开文件 |
ios::in | ios::out | fstream | 打开已存在的文件,既可读取其内容,也可向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错 |
ios::in | ios::out | ofstream | 打开已存在的文件,向其写入数据。文件刚打开时,原有内容保持不变。如果文件不存在,则打开出错 |
ios::in | ios::out | ios::trunc | fstream | 打开文件,既可读取其内容,也可向其写入数据。如果文件本来就存在,则打开时清除原来的内容;如果文件不存在,则新建该文件 |
调用 open() 成员函数时,给出的文件名可以是绝对路径,如 c:\\tmp\\test.txt;也可以是相对路径,即只给出文件名,如 test.txt,此时程序会在当前文件夹(也就是可执行程序所在的文件夹)中寻找要打开的文件。
例如,打开 test.txt 文件,进行写操作,代码如下:
ifstream infile; infile.open("test.txt",ios::out);
通过构造函数打开文件
创建文件流时,可利用其构造函数打开文件,即在创建流时加入参数。语法结构如下:<文件流类> <文件流对象名>(<文件名>,<打开模式>)其中,文件流类可以是 fstream、ifstream 和 ofstream 中的一种。
使用相对路径打开文件 test.txt,进行写操作,代码如下:
ofstream outfile("test.txt",ios::out);
使用绝对路径打开文件 test.txt,进行写操作,代码如下:
ofstream outfile("c::\\test.txt",ios::out);注意,字符“\”表示转义,如果使用“c:\”则必须写成“c:\\”。
当不再对打开的文件进行任何操作时,应及时调用 close() 成员函数关闭文件。
【实例】创建两个文件 test.txt 和 test2.txt,向文件写入字符串,代码如下:
#include <iostream> #include <fstream> using namespace std; int main() { ofstream ofile; cout << "Create file1" << endl; ofile.open("test.txt"); if (!ofile.fail()) { ofile << "name1" << " "; ofile << "sex1" << " "; ofile << "age1"; ofile.close(); cout << "Create file2" << endl; ofile.open("test2.txt"); if (!ofile.fail()) { ofile << "name2" << ""; ofile << "sex2" << ""; ofile << "age2"; ofile.close(); } } return 0; }程序运行将创建两个文件,ofstream 默认打开方式是 std::ios::out | std::ios::trunk,因此当文件夹内没有 test.txt 文件和 test2.txt 文件时,会创建这两个文件,并向文件写入字符串:
- 向 test.txt 文件写入字符串 "name1 sex1 age1";
- 向 test2.txt 文件写入字符串 "name2 sex2 age2"。
如果文件夹内有 test.txt 文件和 test2.txt 文件,则覆盖原有文件内容。