C++ 文件和流


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

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

先生编号 数据类型和描述
1

流外

该数据类型表示输出文件流,用于创建文件并向文件写入信息。

2

如果流

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

3

流媒体

该数据类型一般代表文件流,具有ofstream和ifstream的能力,即可以创建文件、向文件写入信息以及从文件读取信息。

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

打开文件

必须先打开文件,然后才能读取或写入该文件。ofstreamfstream对象均可用于打开文件进行写入。ifstream 对象用于打开文件仅用于读取目的。

以下是 open() 函数的标准语法,该函数是 fstream、ifstream 和 ofstream 对象的成员。

void open(const char *filename, ios::openmode mode);

这里, open()成员函数的第一个参数指定要打开的文件的名称和位置,第二个参数定义打开文件的模式。

先生编号 模式标志和描述
1

ios::应用程序

追加模式。该文件的所有输出都将附加到末尾。

2

ios::吃了

打开一个文件进行输出,并将读/写控件移动到文件末尾。

3

ios::在

打开文件进行读取。

4

ios::输出

打开文件进行写入。

5

ios::截断

如果文件已存在,则在打开文件之前其内容将被截断。

您可以通过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++ 编程时,您可以使用流插入运算符 (<<) 将信息从程序写入文件,就像使用该运算符将信息输出到屏幕一样。唯一的区别是您使用ofstreamfstream对象而不是cout对象。

从文件中读取

您可以使用流提取运算符 (>>) 将文件中的信息读取到程序中,就像使用该运算符从键盘输入信息一样。唯一的区别是您使用ifstreamfstream对象而不是cin对象。

读写示例

以下是以读写模式打开文件的 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() 函数忽略先前读取语句留下的额外字符。

文件位置指针

istreamostream都提供了用于重新定位文件位置指针的成员函数。这些成员函数是istream 的eekg (“seek get”)和ostream 的seekp (“seek put”)。

eekg 和eekp 的参数通常是一个长整数。可以指定第二个参数来指示搜索方向。查找方向可以是ios::beg(默认)用于相对于流的开头定位,ios::cur用于相对于流中的当前位置定位,或ios::end用于相对于流的末尾定位溪流。

文件位置指针是一个整数值,它将文件中的位置指定为距文件起始位置的字节数。定位“获取”文件位置指针的一些示例是 -

// 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 );