您的位置:首页 > 其它

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

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

根据文件对数据的组织形式 , 可分为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个整数给数组 , 将此数组送到此盘中存放 .

#include<fstream>
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int a[10];
ofstream outfile("e://out_put_file.txt",ios::out);
if(!outfile)
{
cerr<<"open error !"<<endl;
exit(1);
}
cout<<"enter 10 integer numbers :"<<endl;
for(int i=0;i<10;i++)
{
cin>>a[i];
outfile<<a[i]<<" ";
}
outfile.close();
return 0;
}


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<string>
#include<sstream>
#include<map>
#include<cctype>
#include<limits.h>
#include<fstream>
#include<stdlib.h>  -        //   首先 头文件不能少  .
using namespace std;
int main()
{
int a[10],maxn,i,order;
ifstream infile("f:/out_put_file.txt",ios::in);  // 现在已经删除了  nocreate  但是仍然有这个作用 .
if(!infile)
{
cerr<<"open error"<<endl;
exit(1);
}
for(int i=0;i<10;i++)
{
infile>>a[i];
cout<<a[i]<<" ";
}
infile.close();
ofstream outfile("f:/out_put_file.txt",ios::out);
for(int i=0;i<5;i++)
{
cin>>a[i];
outfile<<a[i]<<" ";
}
outfile.close();
cout<<endl;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: