位置:首页 > 高级语言 > C++在线教程 > C++文件和流

C++文件和流

到目前为止,我们已经使用了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 );