Cplusplus 简明教程
C++ Files and Streams
到目前为止,我们一直在使用 iostream 标准库,该库分别提供了 cin 和 cout 方法用于从标准输入读取和写入标准输出。
本教程将教您如何读写文件。这需要另一个称为 fstream 的标准C++库,该库定义了三种新的数据类型−
Sr.No |
Data Type & Description |
1 |
ofstream 此数据类型表示输出文件流,用于创建文件和将信息写入文件。 |
2 |
ifstream 此数据类型表示输入文件流,用于从文件读取信息。 |
3 |
fstream 此数据类型通常表示文件流,并具有ofstream和ifstream的功能,这意味着它可以创建文件、将信息写入文件和从文件读取信息。 |
要在C中执行文件处理,必须在C源代码文件中包含头文件<iostream>和<fstream>。
Opening a File
在您可以从文件读取或写入文件之前,必须先打开该文件。可以 ofstream 或 fstream 对象来打开文件进行写入。并且ifstream对象仅用于打开文件以供读取目的。
以下是open()函数的标准语法,它是fstream、ifstream和ofstream对象的成员。
void open(const char *filename, ios::openmode mode);
此处,第一个参数指定要打开的文件的名称和位置,而 open() 成员函数的第二个参数定义了打开文件的模式。
Sr.No |
Mode Flag & Description |
1 |
ios::app 追加模式。将对此文件的所有输出追加到末尾。 |
2 |
ios::ate 为输出打开文件,并将读/写控件移动至文件的末尾。 |
3 |
ios::in 打开文件以进行读取。 |
4 |
ios::out 打开文件以进行写入。 |
5 |
ios::trunc 如果文件已存在,则在打开文件前会截断其内容。 |
你可以通过 OR 操作符将其中的两个或多个值组合在一起。例如,如果你想要在写入模式下打开某个文件,并希望在文件已存在时将其截断,那语法如下所示 −
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
同样的,你可以按如下方式打开文件以进行读写 −
fstream afile;
afile.open("file.dat", ios::out | ios::in );
Closing a File
当 C++ 程序终止时会自动刷新所有流,释放所有已分配的内存并关闭所有已打开的文件。但始终建议程序员在程序终止前关闭所有已打开的文件。
以下是 close() 函数(是 fstream、ifstream 和 ofstream 对象的成员)的标准语法。
void close();
Writing to a File
在编写 C++ 程序时,可以使用流插入运算符 (<<) 将信息从程序写入文件,就像使用该运算符将信息输出到屏幕一样。唯一不同之处在于,你可以使用 ofstream 或 fstream 对象,而不是 cout 对象。
Reading from a File
使用流提取运算符(>>) 可以将信息从文件读入你的程序,就像使用该运算符从键盘输入信息一样。唯一不同之处在于,你可以使用 ifstream 或 fstream 对象,而不是 cin 对象。
Read and Write Example
以下 C++ 程序以读写模式打开文件。在将用户输入的信息写入名为 afile.dat 的文件后,程序会从文件中读取信息并将其输出到屏幕 −
#include <fstream>
#include <iostream>
using namespace std;
int main () {
char data[100];
// open a file in write mode.
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// write inputted data into the file.
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// again write inputted data into the file.
outfile << data << endl;
// close the opened file.
outfile.close();
// open a file in read mode.
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// write the data at the screen.
cout << data << endl;
// again read the data from the file and display it.
infile >> data;
cout << data << endl;
// close the opened file.
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() 函数用于忽略上一条读取语句留下的额外字符。
File Position Pointers
istream 和 ostream 都提供用于重新定位文件位置指针的成员函数。这些成员函数是 seekg (“seek get”)(用于 istream) 和 seekp (“seek put”)(用于 ostream)。
seekg 和 seekp 的参数通常是长整型。可以指定第二个参数来指示 seek 方向。seek 方向可以是 ios::beg (默认值),用于相对于流的起始位置进行定位,也可以是 ios::cur ,用于相对于流中当前位置进行定位,或 ios::end ,用于相对于流的末尾进行定位。
文件位置指针是一个整数值,指定文件(以字节数为单位)中从文件起始位置计算的位置。以下是定位 “get” 文件位置指针的一些示例 −
// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );
// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );
// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );
// position at end of fileObject
fileObject.seekg( 0, ios::end );