到目前为止,我们已经使用了iostream标准库,它提供cin和cout方法,分别从标准输入读取和写入标准输出。
本教程演示如何读取和写入文件。这就需要另一个标准C++库称为fstream,它定义了三个新的数据类型:
数据类型 | 描述 |
---|---|
ofstream | 此数据类型表示输出文件流,并用于创建文件和将信息写入到文件中 |
ifstream | 此数据类型表示输入文件流,并用于从文件中读取信息 |
fstream | 这个数据类型表示文件流一般,且有两个:ofstream和ifstream,这意味着它可以创建文件,将信息写入到文件,并从文件中读出信息的功能 |
要执行C++文件处理,头文件<iostream的>和<fstream>必须包含在C++源代码文件。
打开文件:
文件必须打开,然后才能从中读取或写入。无论是ofstream或fstream对象可以用来打开一个文件进行写操作,如果流对象是用来打开文件为只读的目的。
下面是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 对象。
读取一个文件:
从文件中读取到的信息通过流提取运算符(>>),就像程序使用操作符从键盘输入信息。唯一的区别是使用ifstreamor 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的成员提供函数重新定位文件位置指针。这些成员函数是istream的fseek ("seek set") 和ostream的seekp ("seek put")。
该参数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 );