zoukankan      html  css  js  c++  java
  • 对数据文件的操作和文件流

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

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

     

     

     

  • 相关阅读:
    [CareerCup] 13.7 Node Pointer 节点指针
    [LeetCode] Bulls and Cows 公母牛游戏
    [CareerCup] 13.6 Virtual Destructor 虚析构函数
    [CareerCup] 13.5 Volatile Keyword 关键字volatile
    [CareerCup] 13.4 Depp Copy and Shallow Copy 深拷贝和浅拷贝
    [CareerCup] 13.3 Virtual Functions 虚函数
    [CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map
    [CareerCup] 13.1 Print Last K Lines 打印最后K行
    [CareerCup] 12.6 Test an ATM 测试一个自动取款机
    [LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化
  • 原文地址:https://www.cnblogs.com/A-FM/p/5471132.html
Copyright © 2011-2022 走看看