到目前为止,我们一直使用 iostream
标准库,它提供了 cin
和 cout
方法分别用于从标准输入读取和向标准输出写入。
本教程将教你如何从文件中读取和写入。这需要另一个 C++ 标准库 fstream
,它定义了三种新的数据类型:
-
ofstream
— 此数据类型代表输出文件流,用于创建文件并将信息写入文件。
-
ifstream
— 此数据类型代表输入文件流,用于从文件读取信息。
-
fstream
— 此数据类型代表一般的文件流,具有 ofstream
和 ifstream
的功能,即它可以创建文件,向文件写入信息以及从文件读取信息。
要在 C++ 中处理文件,你的源文件中必须包含头文件 <iostream>
和 <fstream>
。
文件的打开
在你可以从文件读取或写入之前,必须先打开文件。可以使用 ofstream
或 fstream
对象来打开文件以供写入,而 ifstream
对象则用于仅读目的打开文件。
以下是 open()
函数的标准语法,它是 fstream
、ifstream
和 ofstream
对象的成员。
void open(const char *filename, ios::openmode mode);
这里,第一个参数指定了要打开的文件的名称和位置,第二个参数定义了打开文件的模式。
-
ios::app
— 追加模式。所有对该文件的输出都会追加到文件末尾。
-
ios::ate
— 打开文件用于输出并将读/写控制移到文件末尾。
-
-
-
ios::trunc
— 如果文件已经存在,则在打开文件之前将其内容截断。
你可以组合两个或多个这些值,通过将它们一起 OR。例如,如果你想以写入模式打开一个文件,并且如果该文件已经存在则想将其截断,语法如下:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);
类似地,你可以以读写目的打开一个文件如下:
fstream afile;
afile.open("file.dat", ios::out | ios::in);
文件的关闭
当 C++ 程序终止时,它会自动刷新所有流,释放所有分配的内存并关闭所有打开的文件。但是,程序员应在程序终止前手动关闭所有打开的文件。
以下是 close()
函数的标准语法,它是 fstream
、ifstream
和 ofstream
对象的成员。
void close();
向文件写入
在进行 C++ 编程时,你可以使用流插入运算符(<<
)从你的程序向文件写入信息,就像你使用该运算符向屏幕输出信息一样。唯一的区别是你使用 ofstream
或 fstream
对象而不是 cout
对象。
从文件读取
你可以使用流提取运算符(>>
)从文件读取信息到你的程序中,就像你使用该运算符从键盘输入信息一样。唯一的区别是你使用 ifstream
或 fstream
对象而不是 cin
对象。
读写示例
以下是一个 C++ 程序,它以读写模式打开一个文件。在将用户输入的信息写入名为 afile.dat
的文件后,程序从文件读取信息并在屏幕上输出:
#include <fstream>
#include <iostream>
using namespace std;
int main () {
char data[100];
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
outfile << data << endl;
outfile.close();
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
cout << data << endl;
infile >> data;
cout << data << endl;
infile.close();
return 0;
}
当上述代码被编译和执行时,它产生了如下示例输入和输出:
$ ./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9
以上示例使用了来自 cin
对象的附加函数,如 getline()
函数用于从外部读取一行,ignore()
函数用于忽略前一条读取语句留下的额外字符。
文件位置指针
istream
和 ostream
都提供了用于重新定位文件位置指针的成员函数。这些成员函数是 seekg
(用于 istream
)和 seekp
(用于 ostream
)。
seekg
和 seekp
的参数通常是长整型。可以指定第二个参数来指示搜索方向。搜索方向可以是 ios::beg
(默认值)以相对于流的开始定位,ios::cur
以相对于流的当前位置定位或 ios::end
以相对于流的结束定位。
文件位置指针是一个整数值,它指定了文件的位置,单位是从文件起始位置的字节数。一些定位 “获取” 文件位置指针的例子如下:
fileObject.seekg( n );
fileObject.seekg( n, ios::cur );
fileObject.seekg( n, ios::end );
fileObject.seekg( 0, ios::end );