c++将一个复杂的结构体_保存成二进制文件并读取

news2025/1/11 14:50:42

在 C++ 中,可以将复杂的结构体保存到二进制文件中,并从二进制文件中读取它。为了实现这一点,你可以使用文件流库 <fstream>。以下是一个示例,展示如何将一个复杂的结构体保存到二进制文件中,并从二进制文件中读取它。

1. 示例结构体

假设我们有一个复杂的结构体 Person,其中包含一些基本数据类型和字符串。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <cstring>

struct Person {
    char name[50];
    int age;
    double height;
    std::vector<int> scores;

    // Method to serialize the structure to a binary stream
    void serialize(std::ofstream& ofs) const {
        ofs.write(name, sizeof(name));
        ofs.write(reinterpret_cast<const char*>(&age), sizeof(age));
        ofs.write(reinterpret_cast<const char*>(&height), sizeof(height));

        size_t scores_size = scores.size();
        ofs.write(reinterpret_cast<const char*>(&scores_size), sizeof(scores_size));
        ofs.write(reinterpret_cast<const char*>(scores.data()), scores.size() * sizeof(int));
    }

    // Method to deserialize the structure from a binary stream
    void deserialize(std::ifstream& ifs) {
        ifs.read(name, sizeof(name));
        ifs.read(reinterpret_cast<char*>(&age), sizeof(age));
        ifs.read(reinterpret_cast<char*>(&height), sizeof(height));

        size_t scores_size;
        ifs.read(reinterpret_cast<char*>(&scores_size), sizeof(scores_size));
        scores.resize(scores_size);
        ifs.read(reinterpret_cast<char*>(scores.data()), scores_size * sizeof(int));
    }
};

保存结构体到二进制文件

void savePersonToFile(const Person& person, const std::string& filename) {
    std::ofstream ofs(filename, std::ios::binary);
    if (!ofs) {
        std::cerr << "Error opening file for writing: " << filename << std::endl;
        return;
    }
    person.serialize(ofs);
    ofs.close();
}

从二进制文件读取结构体

Person loadPersonFromFile(const std::string& filename) {
    Person person;
    std::ifstream ifs(filename, std::ios::binary);
    if (!ifs) {
        std::cerr << "Error opening file for reading: " << filename << std::endl;
        return person;
    }
    person.deserialize(ifs);
    ifs.close();
    return person;
}

示例用法

int main() {
    Person person;
    std::strcpy(person.name, "John Doe");
    person.age = 30;
    person.height = 5.9;
    person.scores = {85, 90, 78};

    std::string filename = "person.dat";

    // Save to binary file
    savePersonToFile(person, filename);

    // Load from binary file
    Person loaded_person = loadPersonFromFile(filename);

    // Display loaded person information
    std::cout << "Name: " << loaded_person.name << std::endl;
    std::cout << "Age: " << loaded_person.age << std::endl;
    std::cout << "Height: " << loaded_person.height << std::endl;
    std::cout << "Scores: ";
    for (int score : loaded_person.scores) {
        std::cout << score << " ";
    }
    std::cout << std::endl;

    return 0;
}

解释

  1. 序列化和反序列化方法

    • serialize 方法将结构体的各个成员写入到二进制文件中。
    • deserialize 方法从二进制文件中读取结构体的各个成员。
  2. 文件流

    • 使用 std::ofstream 打开文件进行写操作,并设置为二进制模式(std::ios::binary)。
    • 使用 std::ifstream 打开文件进行读操作,并设置为二进制模式(std::ios::binary)。
  3. 字符串和动态数组的处理

    • std::vector 的大小和数据都需要序列化和反序列化,因为它是一个动态数组。
    • char[] 字符数组可以直接写入和读取。

通过上述方法,你可以将复杂的结构体保存到二进制文件中,并从二进制文件中读取它。这种方法可以确保结构体的数据被正确保存和恢复。

2. 运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无序中的秩序:为何看似混乱的工作方式可能更高效;刚刚!研究表明:混乱可能更有利于创造力;注意!你的过度整理可能正在浪费时间

当面对循规蹈矩&#xff0c;还是自由独立的选择题时&#xff0c;你应当选择自由独立。因为这样&#xff0c;你不但更省力&#xff0c;更省心&#xff0c;而且效率更高&#xff0c;生活更好。 在日常生活和工作中,经常会遇到两种截然不同的人: • 一种是事无巨细,将一切都安排得…

【Python】成功解决TypeError: ‘float‘ object cannot be interpreted as an integer

【Python】成功解决TypeError: ‘float’ object cannot be interpreted as an integer 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主…

WSO2 products 文件上传漏洞(CVE-2022-29464)

前言 CVE-2022-29464 是一个影响多个 WSO2 产品的严重远程代码执行&#xff08;RCE&#xff09;漏洞。这些产品包括 WSO2 API Manager、WSO2 Identity Server 和 WSO2 Enterprise Integrator 等。由于用户输入验证不当&#xff0c;该漏洞允许未经身份验证的攻击者在服务器上上…

Snappy使用

Snappy使用 Snappy是谷歌开源的压缩和解压的开发包&#xff0c;目标在于实现高速的压缩而不是最大的压缩 项目地址&#xff1a;GitHub - google/snappy&#xff1a;快速压缩器/解压缩器 Cmake版本升级 该项目需要比较新的cmake&#xff0c;CMake 3.16.3 or higher is requi…

【免费数字孪生平台】医院数据可视化的新选择

随着大数据、云计算、人工智能等技术的深度融合&#xff0c;医院数据智能化升级已成为推动医疗服务质量飞跃的关键力量。 医院作为守护生命健康的前沿阵地&#xff0c;每天处理着海量的医疗数据。从患者病历、检查结果到医疗设备运行状态、医疗资源分配&#xff0c;每一项数据都…

中画幅巡检相机-SHARE 100M A10

【毫厘之间&#xff0c;洞见非凡】 ——SHARE 100M A10中画幅测量相机&#xff0c;巡检行业的新选择 在巡检行业&#xff0c;精准度是关键&#xff0c;深圳赛尔智控科技有限公司最新推出的SHARE 100M A10中画幅测量相机&#xff0c;基于先进的IMX461影像传感器&#xff0c;拥有…

【Linux杂货铺】Linux学习之路:期末总结篇1

第一章 什么是Linux? Linux 是 UNIX 操作系统的一个克隆&#xff1b;它由林纳斯 本纳第克特 托瓦兹从零开始编写&#xff0c;并在网络上众多松散的黑客团队的帮助下得以发展和完善&#xff1b;它遵从可移植操作系统接口&#xff08;POSIX&#xff09;标准和单一 UNIX 规范…

【都市传说】乖乖之神如何保佑台湾AI行业

引言 都市传说中&#xff0c;许多故事都充满神秘和趣味&#xff0c;但很少有故事能够与现代高科技行业相联系。在台湾&#xff0c;关于一款名为“乖乖”的零食如何成为IT和半导体行业的保护神的传说&#xff0c;既神秘又引人入胜。这篇文章将详细探讨乖乖之神如何在台湾AI行业…

第三篇——始计篇:诡计,就是引诱对方犯错误

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 这一篇讲解了诡计&#xff0c;对于诡计的解释和定位&#xff1b;我们更应…

Linux_fileio学习

参考韦东山老师教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 文件IO函数分类2. 函数原型2.1 系统调用接口2.2 标准IO接口 3. fileio内部机制3.1 系统调用接口内部流程3.1 dup函数使用3.2 dup2函数使用 4. open file4.1 open实例4.2 open函数分析…

代码查重软件-自力更生

为了减轻工作量&#xff0c;自研了简单实用的代码查重工具&#xff0c;可以对若干文件之间进行查重。通过调试&#xff0c;相似度大于80%的没有一个是冤枉的。好用。去掉雷同的&#xff0c;其他的代码再慢慢看。

华为手机怎么打印文件?

关于华为手机打印的问题&#xff0c;如果您有打印机&#xff0c;并且已经成功和华为手机相连&#xff0c;在解决上就要容易很多。 具体操作如下&#xff1a; 选择文件 文件来源&#xff1a;华为手机上的文件可以来自多个应用&#xff0c;如图库、备忘录、文件管理等&#xf…

晨持绪科技:新手开抖音网店大概多久能做起来

抖音&#xff0c;这个汇聚亿万目光的舞台&#xff0c;早已成为电商的新战场。新手上路&#xff0c;开一间属于自己的抖音网店&#xff0c;大概需要多久能做起来?这个问题如同询问春日里的花蕾&#xff0c;何时绽放?答案藏于不断努力与摸索的过程之中。 "万事开头难"…

Oracle 集群的守护进程

ohas&#xff1a;主要用于守护cluster ware进程&#xff0c;在单节点建立集群的时候&#xff0c;没有crs&#xff0c;只有ohas、cluster ware GPnP&#xff1a;管理clusterware的配置信息&#xff0c;放在本地磁盘上 crs&#xff1a;管理clusterware中的资源&#xff0c;数据库…

大数据期末复习——hadoop、hive等基础知识

一、题型分析 1、Hadoop环境搭建 2、hadoop的三大组件 HDFS&#xff1a;NameNode&#xff0c;DataNode&#xff0c;SecondaryNameNode YARN&#xff1a;ResourceManager&#xff0c;NodeManager &#xff08;Yarn的工作原理&#xff09; MapReduce&#xff1a;Map&#xff0…

STM32mp157aaa按键中断实验

效果图&#xff1a; 源码&#xff1a; #include "key.h" void hal_key1_rcc_gpio_init() {// 使能GPIOF组RCC->MP_AHB4ENSETR | (0x1 << 5);// 设置引脚位输入模式GPIOF->MODER & (~(0X3 << 18));GPIOF->MODER & (~(0X3 << 16))…

2025年U.S.News世界大学排名前200榜单

近日&#xff0c;U.S. News公布了2025全球最佳院校排名&#xff0c;作为公认的四大世界高校排行榜&#xff0c;该排名主要围绕着学术声誉、学术成果等&#xff0c;因此备受访问学者、联合培养博士生及博士后申请者们青睐&#xff0c;知识人网小编特作介绍并发布排名前200的榜单…

CentOS 7 搭建rsyslog日志服务器

CentOS 7 搭建rsyslog日志服务器 前言一、IP地址及主机名称规划1.修改主机名 二、配置rsyslog日志服务器1.安装rsyslog服务2.编辑/etc/rsyslog.conf 文件3.启动并启用rsyslog服务4.验证端口是否侦听 三、在rsyslog日志服务器上配置firewalld防火墙四、配置rsyslog日志客户端1.编…

DSPy:变革式大模型应用开发

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

Git使用——首次创建本地仓库、配置、初始化、关联远程仓库

1、安装 Git软件 官网&#xff1a;git-scm.com 有时候官网打不开&#xff0c;这里留存个之前下载过的安装包&#xff1a; https://download.csdn.net/download/weixin_43908355/89502977 2、配置本地仓库 在准备建仓库的文件夹里&#xff0c;右键点击&#xff1a;Git Bash …