C++面向对象程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.13 文件输入和输出

程序与文件的数据交换方法同它与标准输入/输出设备的数据交换方法相同,从文件读取数据与从键盘输入数据的方法相似,将数据写入文件与将数据输出到显示器的方法相似。但iostream.h(或iostream)中定义的数据类型和函数只能用于标准输入/输出设备的数据处理。

C++将处理文件的数据类型放在了头文件fstream.h(标准C++是fstream)中,其中定义了ifstream和ofstream两种数据类型,ifstream表示输入文件流,ofstream表示输出文件流。C++文件操作过程可概括为以下5个步骤。

<1> 在程序中包含头文件fstream.h(或fstream):

#include <fstream.h>;

<2> 定义文件流变量:

ifstream inData;  //定义输入文件流变量
ofstream outData;  //定义输出文件流变量

<3> 将文件流变量与磁盘文件关联起来:

fileVar.open(filename,mode)

fileVar是第<2>步定义的文件流变量,filename是磁盘文件名,mode是打开或建立文件的方式,可以是:

ios::in 打开输入文件,ifstream类型变量的默认方式

ios::out 建立输出文件,ofstream类型变量的默认方式

ios::app 增加方式,若文件存在,将在文件尾增加数据;若不存在,就建立文件

ios::trunk 若文件存在,则文件中已有内容将被清除

ios::nocreate 若文件不存在,则打开操作失败

ios::noreplace 若文件存在,则打开操作失败

例如,要打开目录C:\DK下的文件ab.txt,若该文件存在就打开,若不存在就建立该文件,可以用下面的命令建立:

ofstream outData;
outData.open("C:\\DK\\ab.txt",ios::app);

说明:由于“\”被C++语言用于转义符,所以在指定文件路径时用“\\”作为文件路径中目录之间的间隔符,其中第一个“\”是转义符,与回车换行符“\n”中的“\”意义相同。

第<2>、<3>步也可以合并为一步。下面的命令与上面两条命令等价:

ofstream outData("C:\\dk\ab.txt",ios::app);

<4> 用文件流(<<或>>)操作文件,读/写文件数据。将输入文件流变量与>>连接就能够从文件中读入数据,与cin用法相同。将输出文件流变量与<<连接,就能够将数据输出到文件中,与cout用法相同。

<5> 关闭文件。文件操作完成后,应该关闭文件。关闭文件时,系统会立即将文件缓冲区中的数据写回磁盘文件,并且断开文件流变量与磁盘文件之间的联系。关闭文件的方法如下:

inData.close();   //inData是输入文件流变量
ouData.close();   //ouData是输出文件流变量

例2-25】 建立一磁盘文件C:\data.txt,从键盘输入数据:23,34,56,78,98,23,32,89,12到文件中,然后从该磁盘文件中将这些数据读出到数组a中,并计算其总和。

//Eg2-25.cpp
#include<iostream.h>
#include<fstream.h>
void main(){
   ofstream outData("c:\\data.txt"); //在C盘根目录下建立文件data.txt
   ifstream inData;   //定义inData为输入数据的文件
   int x,a[10];
   for (int i=0;i<10;i++){
      cin>>x;
      outData<<x<<" "; //outData将x写入文件data.txt,数据间用空白间隔
}
outData.close();   //关闭文件data.txt
inData.open("C:\\data.txt");//以输入方式打开C:\data.txt文件,以便从中读数据
   int j=0;
   while (!inData.eof())  //从文件中读数据,直到遇到文件结束符
      inData>>a[j++];   //从文件中将数据读入到数组a中
   inData.close();   //关闭文件
   int s=0;
   for(i=0;i<10;i++){
      s+=a[i];
      cout<<a[i]<<" ";   //输出数组a,该数组中的数据来源于文件
   }
   cout<<endl;
   cout<<"the sum is: "<<s<<endl;
}