C++ 文件和流
到目前为止,我们一直在使用 iostream 标准库,它提供了 cin 和 cout 方法,分别用于从标准输入读取和写入标准输出。
本教程将教您如何读取和写入文件。这需要另一个名为 fstream 的标准 C++ 库,它定义了三种新的数据类型 -
Sr.No | 数据类型 &说明 |
---|---|
1 | ofstream 此数据类型表示输出文件流,用于创建文件和将信息写入文件。 |
2 | ifstream 此数据类型表示输入文件流,用于从文件读取信息。 |
3 |
此数据类型通常表示文件流,并且同时具有 ofstream 和 ifstream 的功能,这意味着它可以创建文件、将信息写入文件以及读取来自文件的信息。 |
要在 C++ 中执行文件处理,必须在 C++ 源文件中包含头文件 <iostream> 和 <fstream>。
打开文件
必须先打开文件才能读取或写入文件。ofstream 或 fstream 对象可用于打开文件进行写入。而 ifstream 对象仅用于打开文件进行读取。
以下是 open() 函数 的标准语法,它是 fstream、ifstream 和 ofstream 对象的成员。
void open(const char *filename, ios::openmode mode);
这里,open() 成员函数的第一个参数指定要打开的文件的名称和位置,第二个参数定义打开文件的模式。
Sr.No | 模式标志和说明 |
---|---|
1 | ios::app 附加模式。所有输出到该文件的内容都将附加到末尾。 |
2 | ios::ate 打开一个文件进行输出,并将读/写控制权移至文件末尾。 |
3 | ios::in 打开一个文件进行读取。 |
4 | ios::out 打开一个文件进行写入。 |
5 | ios::trunc 如果文件已存在,则在打开文件之前会截断其内容。 |
您可以通过 或 操作将两个或多个值组合在一起。例如,如果您想以写入模式打开一个文件,并在文件已存在的情况下将其截断,则语法如下 -
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() 函数用于忽略前一个 read 语句留下的多余字符。
文件位置指针
istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数分别是 istream 的 seekg("寻道获取")和 ostream 的 seekp("寻道放置")。
seekg 和 seekp 的参数通常为长整型。可以指定第二个参数来指示寻道方向。定位方向可以是 ios::beg(默认),用于相对于流的开头定位;ios::cur,用于相对于流中的当前位置定位;或者 ios::end,用于相对于流的结尾定位。
文件位置指针是一个整数值,它以距离文件起始位置的字节数来指定文件中的位置。以下是一些使用"get"文件位置指针定位的示例:-
// 定位到 fileObject 的第 n 个字节(假设使用 ios::beg) fileObject.seekg( n ); // 将 fileObject 向前移动 n 个字节 fileObject.seekg( n, ios::cur ); // 定位到 fileObject 末尾往后 n 个字节 fileObject.seekg( n, ios::end ); // 定位到 fileObject 末尾 fileObject.seekg( 0, ios::end );