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+” 打开以读写,如果文件按存在,清空文件

相关推荐

  1. C++二进制文件

    2024-06-17 06:14:01       9 阅读
  2. C++二进制文件

    2024-06-17 06:14:01       12 阅读
  3. c++文件

    2024-06-17 06:14:01       36 阅读
  4. C++文件

    2024-06-17 06:14:01       48 阅读
  5. [C#]文件-1

    2024-06-17 06:14:01       38 阅读
  6. C++文本文件

    2024-06-17 06:14:01       8 阅读
  7. C++BMP文件

    2024-06-17 06:14:01       18 阅读
  8. C语言】文件

    2024-06-17 06:14:01       25 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 06:14:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 06:14:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 06:14:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 06:14:01       20 阅读

热门阅读

  1. 周记-20240616

    2024-06-17 06:14:01       6 阅读
  2. Spring框架的原理及应用详解(六)

    2024-06-17 06:14:01       7 阅读
  3. Springboot&&Spring

    2024-06-17 06:14:01       6 阅读
  4. MySQL学习——在用Connector/NET处理BLOB数据

    2024-06-17 06:14:01       8 阅读
  5. 【前端面试】动态表单篇

    2024-06-17 06:14:01       8 阅读
  6. Elasticsearch-通过分析器进行分词

    2024-06-17 06:14:01       7 阅读
  7. Web前端个人博客设计:创意与技术的融合之旅

    2024-06-17 06:14:01       6 阅读
  8. Spring相关注解详细版

    2024-06-17 06:14:01       10 阅读
  9. 6月16日,每日信息差

    2024-06-17 06:14:01       6 阅读
  10. Redis入门与实践

    2024-06-17 06:14:01       7 阅读
  11. 【双系统 安装ADB】

    2024-06-17 06:14:01       10 阅读
  12. shell 使用 getopt 获取命令行参数。

    2024-06-17 06:14:01       8 阅读
  13. LeetCode //MySQL - 175. Combine Two Tables

    2024-06-17 06:14:01       10 阅读
  14. 【笔试记录】美团 | 230812 | cpp

    2024-06-17 06:14:01       8 阅读