Cplusplus 简明教程

C++ Files and Streams

到目前为止,我们一直在使用 iostream 标准库,该库分别提供了 cincout 方法用于从标准输入读取和写入标准输出。

本教程将教您如何读写文件。这需要另一个称为 fstream 的标准C++库,该库定义了三种新的数据类型−

Sr.No

Data Type & Description

1

ofstream 此数据类型表示输出文件流,用于创建文件和将信息写入文件。

2

ifstream 此数据类型表示输入文件流,用于从文件读取信息。

3

fstream 此数据类型通常表示文件流,并具有ofstream和ifstream的功能,这意味着它可以创建文件、将信息写入文件和从文件读取信息。

要在C中执行文件处理,必须在C源代码文件中包含头文件<iostream>和<fstream>。

Opening a File

在您可以从文件读取或写入文件之前,必须先打开该文件。可以 ofstreamfstream 对象来打开文件进行写入。并且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++ 程序时,可以使用流插入运算符 (<<) 将信息从程序写入文件,就像使用该运算符将信息输出到屏幕一样。唯一不同之处在于,你可以使用 ofstreamfstream 对象,而不是 cout 对象。

Reading from a File

使用流提取运算符(>>) 可以将信息从文件读入你的程序,就像使用该运算符从键盘输入信息一样。唯一不同之处在于,你可以使用 ifstreamfstream 对象,而不是 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

istreamostream 都提供用于重新定位文件位置指针的成员函数。这些成员函数是 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 );