• c++文件操作:2深入


    继续上面<c++文件操作:1入门>的内容

    当我们想要打开的文件不存在的时候,一般地,ofstream类的对象会默认地自动创建一个文件。而如果我们想要打开的文件是存在的,那么就会调用ofstream的构造函数或者是调用open()函数进行打开。下面,我们来看一下MSDN上面是如何定义open()函数的:

     1 void open(
     2     const char *_Filename,
     3     ios_base::openmode _Mode = ios_base::in | ios_base::out,
     4     int _Prot = (int)ios_base::_Openprot
     5 );
     6 void open(
     7     const char *_Filename,
     8     ios_base::openmode _Mode
     9 );
    10 void open(
    11     const wchar_t *_Filename,
    12     ios_base::openmode _Mode = ios_base::in | ios_base::out,
    13     int _Prot = (int)ios_base::_Openprot
    14 );
    15 void open(
    16     const wchar_t *_Filename,
    17     ios_base::openmode _Mode
    18 );
    open()函数原型
     1 _Filename
     2 The name of the file to open.
     3 打开文件名
     4 
     5 _Mode
     6 One of the enumerations in ios_base::openmode.
     7 文件的打开方式(在ios_base::openmode中定义)
     8 
     9 _Prot
    10 The default file opening protection.
    11 默认进行文件打开时的保护
    open()参数说明

    ok,我们再来看看ios_base::openmode中定义的打开方式:

     1 ios::in, to permit extraction from a stream.
     2 打开文件进行读操作,即读取文件中的数据
     3 
     4 ios::out, to permit insertion to a stream.
     5 打开文件进行写操作,即输出数据到文件中
     6 
     7 ios::app, to seek to the end of a stream before each insertion.
     8 打开文件之后文件指针指向文件末尾,只能在文件末尾进行数据的写入
     9 
    10 ios::ate, to seek to the end of a stream when its controlling object is first created.
    11 打开文件之后文件指针指向文件末尾,但是可以在文件的任何地方进行数据的写入
    12 
    13 ios::trunc, to delete contents of an existing file when its controlling object is created.
    14 默认的文件打开方式,若文件已经存在,则清空文件的内容
    15 
    16 ios::binary, to read a file as a binary stream, rather than as a text stream.
    17 打开文件为二进制文件,否则为文本文件
    ios_base::openmode中定义的打开方式

    了,open()函数的用法全部列举出来了。下面就针对ios_base::binary的二进制打开方式,我们在来谈一谈二进制文件的输出方式和文本文件的输出方式。

          ① 文本形式输出到文件,我们完全可以在open函数的mode选项中调用

        ios::out|ios::app

    好了,上面这句话说的就是将数据依次输出。注意,这里用的是依次,原因就是我们采用了app(append)模式,此表示在文件末尾继续写入文件,这就实现了数据的挨个写入 ^_^。一个完整的程序例子如下:

     1 #include <iostream>
     2 #include <fstream>
     3 using namespace std;
     4 const int num=20;
     5 struct people
     6 {
     7     char name[num];
     8     double weight;
     9     int tall;
    10     int age;
    11     char sex;
    12 };
    13 int main()
    14 {
    15     people pe={"李勇",78.5,181,25,'f'};
    16     ofstream fout("people.txt",ios::out|ios::app);
    17     fout<<pe.name<<" "<<pe.age<<" "<<pe.sex<<" "<<pe.tall<<" "<<pe.weight<<" "<<"
    ";
    18     fout.close();
    19     ifstream fin("people.txt");
    20     char ch[255];
    21     fin.getline(ch,255-1,0);
    22     cout<<ch;
    23     fin.close();
    24     return 0;
    25 }
    View Code

      我们可以看到,people.txt文件中的内容和命令行中的一样。

          ② 二进制形式输出到文件 为了能够让其用二进制方式输出文件,我们只需要把上面程序的第16行和17行换做

             ofstream fout("people.txt",ios::bianry);

           fout.write((char*)&pe,sizeof pe);

           程序的第一行中的标志binary用于开启二进制模式,第2行调用了write函数。该函数有2个参数,第一个写入数据的首地址,在这里是结构体pe的地址,第二个参数是写入的字符数目,这里我们用sizeof来计算pe的字符数,具体程序如下:

     1 #include <iostream>
     2 #include <fstream>
     3 using namespace std;
     4 const int num=20;//人员编号的最大值是20
     5 
     6 struct people//人员结构体
     7 {
     8     char name[num];//人员编号
     9     double weight;//人的体重
    10     int tall;//人的身高
    11     int age;//人的年龄
    12     char sex;//人的性别
    13 };
    14 int main()
    15 {
    16     people pe={"李勇",78.5,181,25,'f'};//定义结构体对象pe
    17     ofstream fout("people.txt",ios::binary);//以二进制方式打开文件“people.txt”
    18     fout.write((char*)&pe,sizeof pe);//将结构体pe的数据写入文件
    19     fout.close();//关闭文件流
    20 
    21     people pe1={"张琳",65.4,165,62,'m'};//定义结构体对象pe1
    22     //下面,我们来试一下把pe1中的内容用people.txt文件中的内容替换掉
    23     ifstream fin("people.txt",ios::binary);//以二进制形式打开文件,读取文件内容
    24     fin.read((char*)&pe1,sizeof pe1);//把文件里的信息写入变量pe1
    25     cout<<pe1.name<<" "<<pe1.age<<" "<<pe1.sex<<" "<<pe1.tall<<" "
    26         << pe1.weight <<" "<<"
    ";//输出变量pe1的内容
    27     fin.close();//关闭文件流
    28     return 0;
    29 }
    View Code

    运行效果:

    看到屏幕输出是正常的,而txt文本里的输出却出现乱码。这就是因为people.txt文件是以文本方式打开的,而不是以二进制形式打开的,所以我们看到的都是乱码。

  • 相关阅读:
    Netflix Ribbon(负载均衡)介绍
    Annotation 注解
    框架设计的灵魂-反射
    idea maven java.lang.outofmemoryerror gc overhead limit exceeded
    洛谷P4427 [BJOI2018]求和
    洛谷P1196 [NOI2002]银河英雄传说
    CF191C Fools and Roads
    洛谷P2296 寻找道路
    洛谷P3389 【模板】高斯消元法
    洛谷P1351 联合权值
  • 原文地址:https://www.cnblogs.com/baoxiaofei/p/4265858.html
Copyright © 2020-2023  润新知