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; }