当前位置: 首页 > news >正文

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

在 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 streamvoid 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 streamvoid 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 filesavePersonToFile(person, filename);// Load from binary filePerson loaded_person = loadPersonFromFile(filename);// Display loaded person informationstd::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. 运行结果

相关文章:

  • Spark2.0
  • 简单爬虫案例——爬取快手视频
  • BMA530 运动传感器
  • 【LeetCode】976. 三角形的最大周长
  • Kafka 位移
  • rpm包下载
  • 自然语言处理基本知识(1)
  • 【CSS】深入探讨 CSS 的 `calc()` 函数
  • 熊猫烧香是什么?
  • 什么是CC攻击,如何防止网站被CC攻击的方法
  • Spring Cloud LoadBalancer基础入门与应用实践
  • 如何获得更高质量的回答-chatgpt
  • vue为啥监听不了@scroll
  • word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法
  • 事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)
  • 【Leetcode】101. 对称二叉树
  • [译]前端离线指南(上)
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2017前端实习生面试总结
  • Cookie 在前端中的实践
  • create-react-app项目添加less配置
  • Mysql数据库的条件查询语句
  • vue数据传递--我有特殊的实现技巧
  • 闭包--闭包作用之保存(一)
  • 聊聊flink的BlobWriter
  • 入门级的git使用指北
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 鱼骨图 - 如何绘制?
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #QT项目实战(天气预报)
  • $(selector).each()和$.each()的区别
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (3) cmake编译多个cpp文件
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (十三)Maven插件解析运行机制
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)jdk与jre的区别
  • (转)linux下的时间函数使用
  • (转)Oracle存储过程编写经验和优化措施
  • (转)Scala的“=”符号简介
  • (转)大道至简,职场上做人做事做管理
  • (转)详解PHP处理密码的几种方式
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .Mobi域名介绍
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET MVC 验证码
  • .net 简单实现MD5
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET构架之我见