对数据文件的操作和文件流
一直到现在,我还是用键盘对程序进行输入,但是实际情况中大部分是对文件进行读取和输出,今天就学习一下对文件的输入输出 .
根据文件对数据的组织形式 , 可分为ascll文件和二进制文件 "ascll"文件 又称 文本文件或字符文件 . 文件流 不是若干个文件组成的流 而是以 文件流输入输出 若要对文件进行输入输出 , 若要对文件进行输入输出 . 就必须通过文件流 来实现 .
现有 三个 用于文件操作的文件类 .
ifstream 类 他是从istream类 派生而来的 . 支持从磁盘文件的 输入
ofstream 类 他是从ostream类 派生而来的 . 支持从磁盘文件的 输出
fstream 类 他是从iostream类 派生而来的 . 支持对磁盘文件的输入输出 .
可以用下面一个方法 , 建立一个对文件的输出流对象 .
ofstream outfile;
如同在头文件iostream中定义了 刘对象cout 一样 , 现在在程序中定义了 outfile 为ofstream类 的对象 , 但是还有一个问题没有解决 . 在定义 cout 是已经将他和标准输出设备( 显示器 ) , 建立关联 , 而现在虽然建立了一个输出文件流对象 . 但是还未指定他想那一个磁盘文件输出 , 需要在使用的时候 加以定义 . 下面解决这个问题 .
文件的打开和关闭 .
( 1 ) : 为文件流对象和指定的磁盘之间建立联系 .一边是文件流流向指定的磁盘文件 .
( 2 ) : 指定文件的工作方式 . 例如该文件是作为输入文件还是输出文件 ,是ascll 文件 还是 二进制文件 .
以上工作可以通过两种不通过的方式实现 .
ofstream outfile; // 定义 ofstream 类 (输出文件类) outfile.open("fl.dat",ios::out); // 使文件与fl.dat文件建立联系 ,
第二行是调用文件输出流的 .open打开磁盘的 fl.dat 文件并制定它为输出文件 . 文件流对象将磁盘文件fl.dat输出数据 ios::out 是I/O 模式的一种 , 表示以输出方式打开一个文件 . 或者简单说 , 此时的fl.dat 是一个输出文件 , 接收从内存 输出的数据 .
调用成员函数 open 的一般形式 为 .
文件流对象.open(磁盘文件名,输入输出方式);
磁盘文件名可以包括路径 如 " c:\new\fl.dat " , 如果缺少路径名的话 就默认为当前路径 .
在定义文件流对象时带指定参数 ,
在声明文件流对象时定义了带参数的构造函数 , 其中包含了打开磁盘文件的功能 , 因此可以在定义文件流对象时指定参数,调用文件类的构造函数 , 来实现打开文件的功能 . ru
ostream outfile("fl.dat",ios::out); // 一般情况下多用此形式 , 比较方便 , 作用于open函数 相同 .
输入输出实在ios类中定义的 , 他们是枚举常量有多种选择 .
( 1 ) 新版本的I/O 类库中不提供ios::nocreate和ios::noreplace
( 2 ) 每一个打开的文件都有一个文件指针,该指针的初始位置由I/O方式制定,每次读写都从文件指针的当前位置开始.每读入一个字节,指针就后移一个直接.当文件指针移到最后就会遇到文件的结束(文件的结束也占一个字节,其值为-1),此时刘对象的成员函数eof的值为非零值(一般为1),表示文件结束.
( 3 ) 可以用"位或"运算符"|"对输入输出方式进行组合
上述的方式倒可以组合但是像下面这一种互相排斥的不可以
ios::nocreate|ios::noreplace ( 4 ) 如果打开操作失败,open函数的返回值为0 , 如果是构造函数的方式打开文件的,则刘对象的值为0.可以据此测试打开是否为0 如
if(outfile.open("fl.dat",ios::app)==0) cout<<"open error"; 或 if(!outfile.open("fl.dat",ios::app)) cout<<"open error";
2 : 关闭文件 .
在对已打开的磁盘文件的读写操作完成后,应关闭该文件.关闭文件用成员函数close 如 . outfile.close(); // 将输出文件流所关联的磁盘文件关闭
所谓关闭,实际上是解除该磁盘文件与文件流的关联,原来设置的工作方式也失效,这样,就不能在通过文件流对该文件进行输入输出.此时可以将文件流与其他磁盘文件建立关联,通过文件流对新的文件进行输入或输出.
对ascll文件的操作.
ascll文件 : 如果文件的每一个直接中均以ascllascll代码的形式存放数据 , 即一个字节存放一个字符 , 这个文件就是ascll 文件( 或称字符文件 ) 对ascll 文件的操作,可以用两种方法;
用流插入运算符 "<<" 和流提取运算符 ">>" 输入输出标准类型的数据. "<<"和">>" 都已经在 iostream 中被重载为能用于ostream 和istream类对象的标准类型的输入输出 . 由于ifstream和ofstream分别是ostream和istream类的派生类型 . 因此他们从ostream和is他ream类继承了公用的重载函数 . 所以在对磁盘文件的操作中 , 可以通过文件流对象和流插入对象运算符 "<<" 和流提取运算符">>"实现对磁盘的读写 .
下面我们来举一个栗子 .
有一个整形术组,含是个元素,从键盘输入10个整数给数组 , 将此数组送到此盘中存放 .
1 #include<fstream> 2 #include<iostream> 3 #include<stdlib.h> 4 using namespace std; 5 int main() 6 { 7 int a[10]; 8 ofstream outfile("e://out_put_file.txt",ios::out); 9 if(!outfile) 10 { 11 cerr<<"open error !"<<endl; 12 exit(1); 13 } 14 cout<<"enter 10 integer numbers :"<<endl; 15 for(int i=0;i<10;i++) 16 { 17 cin>>a[i]; 18 outfile<<a[i]<<" "; 19 } 20 outfile.close(); 21 return 0; 22 }
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 #include<fstream> 16 #include<stdlib.h> - // 首先 头文件不能少 . 17 using namespace std; 18 int main() 19 { 20 int a[10],maxn,i,order; 21 ifstream infile("f:/out_put_file.txt",ios::in); // 现在已经删除了 nocreate 但是仍然有这个作用 . 22 if(!infile) 23 { 24 cerr<<"open error"<<endl; 25 exit(1); 26 } 27 for(int i=0;i<10;i++) 28 { 29 infile>>a[i]; 30 cout<<a[i]<<" "; 31 } 32 infile.close(); 33 ofstream outfile("f:/out_put_file.txt",ios::out); 34 for(int i=0;i<5;i++) 35 { 36 cin>>a[i]; 37 outfile<<a[i]<<" "; 38 } 39 outfile.close(); 40 cout<<endl; 41 }