C++ 文件和流
-
文件和流
到目前为止,我们一直在使用iostream标准库,该库提供cin和cout方法,分别用于从标准输入读取和写入标准输出。本教程将教您如何从文件读取和写入。这需要另一个称为fstream的标准C++库,该库定义了三种新的数据类型-- ofstream - 此数据类型表示输出文件流,用于创建文件和将信息写入文件。
- ifstream - 此数据类型表示输入文件流,用于从文件中读取信息。
- fstream - 此数据类型通常表示文件流,并且具有ofstream和ifstream的功能,这意味着它可以创建文件,向文件写入信息以及从文件读取信息。
要在C ++中执行文件处理,标头文件<iostream>和<fstream>必须包含在C++源文件中。 -
打开文件
必须先打开文件,然后才能读取或写入文件。无论是ofstream的或fstream的对象可以用来打开文件进行写入。而且ifstream对象用于打开文件仅用于读取目的。以下是open()函数的标准语法,该函数是fstream,ifstream和ofstream对象的成员。void open(const char *filename, ios::openmode mode);
在这里,第一个参数指定要打开的文件的名称和位置,而open()成员函数的第二个参数定义应打开文件的模式。模式 描述 ios::app 追加模式。该文件的所有输出都将附加到末尾。 ios::ate 打开文件以输出,并将读/写控件移到文件末尾。 ios::in 打开文件进行读取。 ios::out 打开文件进行写入。 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]; // 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语句留下的多余字符。 -
文件位置指针
istream和ostream都提供了用于重新定位文件位置指针的成员函数。这些成员函数是seekg(“查找获取”)和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.seekg( 0, ios::end );