C++二进制文件的读与写

1. 二进制文件的读与写ofstream fout; ifstream fin;

——学习把结构体类型写到二进制文件中。
代码实现:

/*
_4.cpp 学习总结 视频学习C++_Primer_Plus_17_6
1. 二进制文件的读与写
2. 写操作:fout类比cout操作,cout能操作的fout也适用
3. 易错点1:读写操作时,读in,写out,不可写错
    易错点2:写操作时,添加要求时,貌似或(|)与或之间的顺序也要注意
4. fout.write((char *) &p1, sizeof p1);
    解释两个参数
    参数1:地址。&p1表示地址,(char *)强转,固定,
    参数2:字节大小。
    读函数同理
    类知识中对这个两个函数有详细讲解
*/
#include <iostream>
#include <fstream>
#include <iomanip> //输出格式用

//内联函数吃没用的字符
inline void eatline() { while(std::cin.get() != '\n') continue; }

struct Planet
{
    char name[20];
    double papolation;
    double g;
};//结构体星球

const char* filename = "plants.dat";

int main()
{
    using namespace std;

    //写进二进制文件
    ofstream fout(filename, ios_base::out | ios_base::app | ios_base::binary);

    Planet p1;   
    cout << "以空白行结束输入:" << endl;
    cin.get(p1.name, 20);
    while(p1.name[0] != '\0')
    {
        eatline();//吃没用的字符
        //输入星球数据
        cin >> p1.papolation;
        cin >> p1.g;
        eatline();//吃没用的字符
        
        //写操作
        
        fout.write((char *) &p1, sizeof p1);
        
        cout << "以空白行结束输入:" << endl;
        cin.get(p1.name, 20);
    }
    fout.close();

    //读二进制文件
    ifstream fin;
    fin.open(filename, ios_base::in | ios_base::binary);
    if(!fin.is_open())
    {
        cout << "打不开此文件:" << filename << endl;
        exit(EXIT_FAILURE);
    }

    cout << fixed;//不用科学计数法显示
    cout.precision(2);//精度保留两位小数
    cout.setf(ios_base::showpoint);//显示小数点,不写(输入135.0,显示135)
    cout << "读文件并显示:" << endl;
    while(fin.read((char *) &p1, sizeof p1))
    {
        cout << "Name: " << p1.name << endl;
        cout << "Population: " << p1.papolation << endl;
        cout << "G: " << p1.g << endl;
    }

    fin.close();
    return 0;
}

2. 在二进制文件的任意位置进行存储或者修改 fstream finout;

——修改二进制文件中的结构体内容。
代码实现:

/*
_5.cpp 学习总结 视频学习C++_Primer_Plus_17_7
1.  修改二进制文件中的结构体内容
	planet.dat二进制文件已存在(内容为4个Planet)
    该示例将完成以下工作:
    a. 询问要修改哪条记录
    b. 显示未修改的记录 
    c. 显示已修改的记录

2. seekg():将输入指针移至指定的文件位置
    seekp():将输出指针移到指定文件位置
    原型1:seekg(streampos) streampos place = rec * sizeof p1;
    原型2:seek(streamoff, ios_base::seekdir) 未应用
3. fstream finout; 读写都可以
*/
#include <iostream>
#include <fstream>
#include <iomanip> //输出格式用

//内联函数吃没用的字符
inline void eatline() { while(std::cin.get() != '\n') continue; }

struct Planet
{
    char name[20];
    double papolation;
    double g;
};//结构体星球

const char* filename = "plants.dat";

int main()
{
    using namespace std;

    Planet p1;
    fstream finout;

    //打开二进制文件,可能读也可能写,planet.dat二进制文件已存在(内容为4个Planet)
    finout.open("planets.dat", ios_base::in | ios_base::out | ios_base::binary);
    if(!finout.is_open())
    {
        cout << "打不来此文件:planets.dat" << endl;
        exit(EXIT_FAILURE); 
    }

    //修改第 rec 个结构体的内容,rec(0,1,2,3...),place即是第rec的首地址
    cout << "输入要修改的第几个结构体内容(0,1,2,3): ";
    int rec; cin >> rec; eatline();
    streampos place = rec * sizeof p1;
    
    //文件输出指针重新定位
    finout.seekg(place);
    //把该位置的内容存到p1内
    finout.read((char *)&p1, sizeof p1);
    
    //显示该位置本来内容
    cout << "显示该位置本来内容: " << endl;
    cout << "Name: " << p1.name << endl;
    cout << "Poluation: " << p1.papolation << endl;
    cout << "G: " << p1.g << endl;

    //输入要修改的的内容:
    cout << "输入要修改的的内容:" << endl;
    cout << "Name: ";
    cin >> p1.name;
    cout << "Population: ";
    cin >> p1.papolation;
    cout << "G: ";
    cin >> p1.g;
    eatline();
    //文件输入指针重新定位,然后写入
    finout.seekp(place);
    finout.write((char *)&p1, sizeof p1);

    
    //再次显示该位置内容:
    cout << "再次显示该位置内容:" << endl;
    finout.seekg(place);
    finout.read((char *)&p1, sizeof p1);
    cout << "Name: " << p1.name << endl;
    cout << "Poluation: " << p1.papolation << endl;
    cout << "G: " << p1.g << endl;

    return 0;
}

3. 知识点。

常量含义
ios_base::in打开文件,以便读取
ios_base::out打开文件
ios_base::out打开文件,以便写入
ios_base::app追加到文件末尾
ios_base::trunc如果文件存在,清空文件内容
ios_base::binary二进制文件
C++模式C模式含义
ios_base::in“r”打开文件,以便读取
ios_base::out“w”等价于ios_base::out | ios_base::trunc
ios_base::out | ios_base::trunc“w”打开以写入,如果文件存在,先清空文件
ios_base::out | ios_base::app“a”打开以写入,只追加
ios_base::in | ios_base::out“r+”打开以读写,在文件允许的位置写入
ios_base::in | ios_base::out | ios_base::trunc“w+”打开以读写,如果文件按存在,清空文件
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "二进制文件"是指计算机中以二进制形式存储的文件类型。与文本文件不同,二进制文件不以普通的文字格式进行编码,而是直接以计算机可以理解的二进制代码表示。 二进制文件可以包含各种类型的数据,例如图像、音频、视频、执行程序等。这些文件通常由开发人员或专门的程序生成,用于存储和传输大量数据或特定格式的信息。 相比于文本文件二进制文件的主要优势在于它们可以更有效地存储和处理大型数据集合。由于二进制文件二进制编码,可以更节省存储空间,同时也可以通过二进制数据进行更快速的数据处理操作。 二进制文件通常不可直接阅或修改,因为其内容被以特定的格式和结构进行编码。为了访问或修改二进制文件,需要通过特定的程序或工具进行操作,例如图像编辑软件、音频编辑器或反编译器。 总而言之,二进制文件是计算机系统中一种重要的文件类型,用于存储和传输大量数据或特定的格式化信息。它们在各个领域中起着重要作用,例如软件开发、图像处理、音视频媒体等。理解二进制文件的概念和使用方法,对于计算机科学和信息技术领域的学习和实践都至关重要。 ### 回答2: 二进制文件(bin)是一种计算机文件格式,用于存储以二进制形式编码的数据或程序。与文本文件不同,二进制文件中的数据不是以可的字符形式表示,而是以0和1的二进制数编码。 在计算机中,所有的数据都是以二进制形式存储和处理的。而二进制文件则是直接将数据按照二进制位的方式存储在文件中,而不需要进行字符编码或解码。这使得二进制文件更加高效,可以存储和处理更大量的数据。 二进制文件可以包含各种类型的数据,如图像、音频、视频等多媒体文件,或者是程序的可执行文件。相比于文本文件二进制文件可以更精确地表示复杂的数据结构和内存布局,因此在一些需要高效处理数据或保护数据完整性的应用中广泛使用。 在计算机中,二进制文件读写通常需要使用特定的文件处理函数或库进行操作。这些函数可以直接取或二进制数据,而不需要对数据进行字符编码和解码。同时,由于二进制文件中的数据没有被解释为字符,因此在编辑或修改二进制文件时需要特殊的编辑器或工具。 总而言之,二进制文件是一种以二进制形式编码的文件格式,可以存储和处理各种类型的数据。与文本文件相比,二进制文件更加高效和灵活,适用于处理大量数据或保护数据完整性的应用场景。 ### 回答3: 二进制文件,简称bin文件,是一种以二进制形式存储的文件格式。与文本文件不同,二进制文件中的数据不以可的字符形式表示,而是以二进制码的形式表达。 二进制文件通常由计算机程序生成或用于存储各种数据类型,例如图像、音频、视频等。相比于文本文件二进制文件在存储效率和数据完整性方面具有明显优势。由于数据以二进制码存储,二进制文件可以更加高效地利用存储空间,而不会损失数据的精确性。 二进制文件在计算机领域有广泛应用。例如,编译后的可执行文件就是一种二进制文件。当程序编译完成后,会生成一系列的二进制指令,这些指令存储在二进制文件中,以便计算机能够理解和执行。 此外,二进制文件还用于存储图像、音频和视频等媒体数据。这些文件非常庞大,如果以文本形式存储将占用大量的存储空间。而将这些数据以二进制形式存储,不仅可以节省存储空间,还可以高速地取和处理这些数据。 总之,二进制文件是一种以二进制形式存储的文件格式,可以高效地存储和处理各种数据类型。它在计算机程序、媒体数据等领域得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值