zoukankan      html  css  js  c++  java
  • C++ 文件二进制输入输出

    文本文件和二进制文件

    我们一般将文件分为文本文件和二进制文件。文本文件就是可以通过文本编辑器打开和编辑的文件,如使用Windows中的记事本(NotePad)或UNIX中的vi可以处理的文件。非文本文件都是二进制文件,我们不能直接使用文本编辑器编辑他们,而是通过计算机程序来处理的。常见的二进制文件,比如:图片,视频,音频以及可执行文件。

    也就是说,文本文件由字符序列构成,而二进制文件由二进制位序列构成。

    但是从本质上说,文件都是二进制文件。因为对于计算机来说,它只能够识别二进制的文件。我们所说的文本文件,其实本质也是二进制文件,只是通过编码(encode)将二进制位转换为了字符(编码格式想必不用多说,常见的有ASCII,GBK,Unicode等),以便人类更好地阅读。

    因此我们说,文本I/O是建立在二进制I/O的基础上的,在其之上提供了一层字符编码/解码的抽象。

    二进制I/O不许要任何转换。如果采用二进制I/O方式向文件中写入一个数值,那么内存中存储的值会原样复制到文件中。

    那么我们如何使用二进制I/O呢?在前边的博客(C++ fstream和文件打开模式)提到过,要使用ios::binary打开文件。缺省条件下,文件是以文本文件打开的。

    二进制文件的输入和输出

    我们之前使用流操作符或者一些函数(put,get,getline)来读写文本文件。但是对于二进制文件,需要使用read和write函数,或者get、put、getline函数进行读写操作。

    (为了方便下文用.dat文件表示二进制文件)

    write函数

    语法:

    streamObject.write(const char* s, int size)

    streamObject是流对象

    s是一个字符数组

    size是s的长度

    下面看一个例子:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        ofstream binaryio("city.dat", ios::binary);
        string city = "北京";
    
        binaryio.write(city.c_str(), sizeof(city));
        binaryio.close();
    
        cout << "二进制文件city.dat创建成功!" << endl;
    
        return 0;
    }

    运行结果:

     上面的例子中,写入的是字符数据,但是很多情况下,我们要写入非字符数据,如数字。那么我们可以使用reinterpret_cast来实现。此运算符可以将一个指针类型转换为不相关的指针类型。它只是简单地进行了指针值的二进制复制,并不改变指针所指向的数据。语法如下:

    reinterpret_cast<datatype*>(address)

    address是输出数据的起始地址

    datatype是希望转换为的类型

    在进行二进制I/O时,应转换为char类型。

    看下面的例子:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        ofstream binaryio("temp.dat", ios::binary);
        int value = 120;
    
        binaryio.write(reinterpret_cast<char*>(&value), sizeof(value));
        binaryio.close();
    
        cout << "二进制文件temp.dat创建成功!" << endl;
    
        return 0;
    }

    运行结果:

     

     read函数

    语法:

    streamObject.read(const char* address, int size)

    size指最大字节数,实际读取的字符数可以从成员函数gcount中获取。

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        ifstream binaryio("city.dat", ios::binary);
        char s[10];
    
        binaryio.read(s,10);
        cout << "读入的字节数为:" << binaryio.gcount() << endl;
        s[binaryio.gcount()] = '';
        cout << s << endl;
        binaryio.close();
    
        return 0;
    }

    运行结果:

     如果想读入非字符数据,那么仍然使用reinterpret_cast

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        ifstream binaryio("temp.dat", ios::binary);
        int value;
    
        binaryio.read(reinterpret_cast<char*>(&value),sizeof(value));
        cout << "读入的字节数为:" << binaryio.gcount() << endl;
        cout << value << endl;
        binaryio.close();
    
        return 0;
    }

    运行结果:

  • 相关阅读:
    荧光机理的应用——光学式农药测量技术及系统设计
    滤光片应用——红外吸收粉尘传感器的设计
    磁靶向纳米Fe3O4-TiO2复合物对肝癌细胞的光催化杀伤效应研究
    常用荧光染料的激发波长和发射波长
    光害
    一文解读虚拟化服务器
    一文解读PRA
    主数据建设的挑战与发展
    数字孪生技术变革
    intellij idea:配置maven 3.8.2(intellij idea 2021.2)
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12916196.html
Copyright © 2011-2022 走看看