📜  C++文件和流

📅  最后修改于: 2020-12-17 05:13:43             🧑  作者: Mango


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

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

Sr.No Data Type & Description
1

ofstream

This data type represents the output file stream and is used to create files and to write information to files.

2

ifstream

This data type represents the input file stream and is used to read information from files.

3

fstream

This data type represents the file stream generally, and has the capabilities of both ofstream and ifstream which means it can create files, write information to files, and read information from files.

要在C++中执行文件处理,头文件必须包含在C++源文件中。

开启档案

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

以下是打开的()函数,这是fstream的,ifstream的,和ofstream的对象的成员的标准语法。

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

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

Sr.No Mode Flag & Description
1

ios::app

Append mode. All output to that file to be appended to the end.

2

ios::ate

Open a file for output and move the read/write control to the end of the file.

3

ios::in

Open a file for reading.

4

ios::out

Open a file for writing.

5

ios::trunc

If the file already exists, its contents will be truncated before opening the file.

您可以将这些值中的两个或多个合并在一起,对其进行“或”运算。例如,如果您想以写入模式打开文件并想在已经存在的情况下截断文件,则语法如下-

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

类似地,您可以打开文件以进行读写,如下所示:

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

关闭档案

当C++程序终止时,它会自动刷新所有流,释放所有分配的内存并关闭所有打开的文件。但是,程序员应在程序终止前关闭所有打开的文件,这始终是一种好习惯。

以下是对于接近()函数,这是fstream的,ifstream的,和ofstream的对象的成员的标准语法。

void close();

写入文件

在执行C++编程时,您可以使用流插入运算符(<<)将信息从程序写入文件中,就像您使用该运算符将信息输出到屏幕上一样。唯一的区别是您使用ofstreamfstream对象而不是cout对象。

从文件读取

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

读写示例

以下是C++程序,该程序以读写模式打开文件。将用户输入的信息写入名为afile.dat的文件后,程序将从文件中读取信息并将其输出到屏幕上-

#include 
#include 
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()函数忽略先前的read语句留下的多余字符。

文件位置指针

istreamostream都提供用于重新定位文件位置指针的成员函数。这些成员函数是istream的seekg (“寻求获取”)和ostream的seekp (“寻求认沽”)。

seekg和seekp的参数通常是一个长整数。可以指定第二个参数来指示搜索方向。查找方向可以是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 );