C++ 文件和流
到目前为止,我们一直在使用 iostream 标准库,它提供了 cin 和 cout 方法,用于从标准输入读取和写入到标准输出。
这个教程将教你如何从文件中读取和写入数据。这需要另一个名为 fstream 的标准C++库,它定义了三种新的数据类型−
序号 | 数据类型和描述 |
---|---|
1 | ofstream 该数据类型表示输出文件流,用于创建文件并向文件中写入信息。 |
2 | ifstream 该数据类型表示输入文件流,用于从文件中读取信息。 |
3 | fstream 该数据类型代表文件流,具有ofstream和ifstream的功能,意味着它可以创建文件,向文件中写入信息,以及从文件中读取信息。 |
要在C++中执行文件处理,必须在C++源文件中包含头文件
打开文件
在读取或写入文件之前,必须先打开文件。可以使用 ofstream 或 fstream 对象来打开文件进行写入。而 ifstream 对象仅用于打开文件进行读取。
下面是open()函数的标准语法,它是fstream、ifstream和ofstream对象的成员之一。
void open(const char *filename, ios::openmode mode);
在这里,第一个参数指定要打开的文件的名称和位置, open() 成员函数的第二个参数定义了应该以何种模式打开文件。
序号 | 模式标志和描述 |
---|---|
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 );
关闭文件
当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()函数忽略前一个读取语句留下的多余字符。
文件位置指针
istream 和 ostream 都提供了重新定位文件位置指针的成员函数。这些成员函数分别是 seekg (”seek get”,用于istream)和 seekp (”seek put”,用于ostream)。
seekg和seekp的参数通常是一个长整型数。可以指定第二个参数来表示寻找的方向。寻找的方向可以是 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 );