对数据文件的操作和文件流

一直到现在,我还是用键盘对程序进行输入,但是实际情况中大部分是对文件进行读取和输出,今天就学习一下对文件的输入输出  .

根据文件对数据的组织形式 , 可分为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 }

 

 

 

 

 

转载于:https://www.cnblogs.com/A-FM/p/5471132.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值