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. 运行结果

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

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

相关文章

【高中数学/三角函数】已知:实数a,b,c满足a+b+c=0,且a^2+b^2+c^2=1 求:a的最大值?

【问题】 已知&#xff1a;实数a,b,c满足abc0,且a^2b^2c^21 求&#xff1a;a的最大值&#xff1f; 【问题来源】 https://www.ixigua.com/7289764285772497448?logTag0d228277f3a8e049ab6d 【解答】 解&#xff1a;由abc0可得c-(ab) 代入a^2b^2c^21得a^2b^2(ab)^21 又…

深入MOJO编程语言的单元测试世界

引言 在软件开发的历程中&#xff0c;单元测试扮演着至关重要的角色。单元测试不仅帮助开发者确保代码的每个部分都按预期工作&#xff0c;而且也是代码质量和维护性的关键保障。本文将引导读者了解如何在MOJO这一假想编程语言中编写单元测试&#xff0c;尽管MOJO并非真实存在…

Docker在windows上使用vscode远程连接容器

目录 一、提前准备&#xff1a; 二、vscode连接docker容器 三、构建好的docker容器直接连接vscode 四、Windows下的可视化出linux的ui界面 在日常的开发中&#xff0c;不想windows和linux两个系统之间来回切换&#xff0c;笔者最近打算所有的环境均在一个系统上完成。为了交…

Nosql期末复习

mongodb基本常用命令&#xff08;只要掌握所有实验内容就没问题&#xff09; 上机必考&#xff0c;笔试试卷可能考&#xff1a; 1.1 数据库的操作 1.1.1 选择和创建数据库 &#xff08;1&#xff09;use dbname 如果数据库不存在则自动创建&#xff0c;例如&#xff0c;以下…

学习无人机飞行技术,有哪些就业方向?

随着无人机技术的不断进步和应用领域的拓展&#xff0c;研发创新人才的需求也将不断增加&#xff0c;那就业前景还是很广阔的。学习无人机飞行技术后&#xff0c;有以下多个就业方向可供选择&#xff1a; 1. 无人机操作员&#xff1a; - 负责操控和监控无人机飞行&#xff0c;…

基于索尼基于索尼Spresense的眼睛跟随平台中两个模型的对比

1.模型一(现在使用的) 这个模型是一个简单的神经网络&#xff0c;由三个主要组件组成&#xff1a;输入层、一个全连接层&#xff08;Affine层&#xff09;、一个Sigmoid激活函数层和一个Binary Cross Entropy损失层。 以下是每个组件的说明&#xff1a; Input 层&#xff1a;这…

ubuntu 更换软件源

ubuntu 更换软件源 在Ubuntu 20.04 LTS中更换软件源可以通过图形界面或命令行进行。更换软件源通常是为了加快软件包的下载速度或解决软件源不可用的问题。这里我将分别说明如何通过图形界面和命令行更换软件源。 通过图形界面更换软件源&#xff1a; 打开“软件和更新”设置…

【LeetCode】验证回文串

目录 一、题目二、解法完整代码 一、题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &…

问题集锦1

01.inner中使用JwtTokenUtil.getUserCode() 前端调用上传&#xff08;java&#xff09;&#xff0c;上传使用加购 Overridepublic Boolean insertShoppingCart(InsertShoppingCartParamsDto dto) {// 通过userCode,itemCode和supplierCode来判断当前加购人添加到购物车的商品是…

51单片机第23步_定时器1工作在模式0(13位定时器)

重点学习51单片机定时器1工作在模式0的应用。 在51单片机中&#xff0c;定时器1工作在模式0&#xff0c;它和定时器0一样&#xff0c;TL1占低5位&#xff0c;TH1占高8位&#xff0c;合计13位&#xff0c;也是向上计数。 1、定时器1工作在模式0 1)、定时器1工作在模式0的框图…

查看Oracle是哪个Oracle_home 下启动的

[rootrac1 ~]# ps -ef|grep smon root 413 24903 0 22:30 pts/0 00:00:00 grep --colorauto smon root 27165 1 0 22:11 ? 00:00:09 /u01/app/19.0.0/grid/bin/osysmond.bin grid 27784 1 0 22:12 ? 00:00:00 asm_smon_ASM1 oracl…

基础不牢地动山摇:JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用——干货语法大全

基础不牢地动山摇&#xff1a;JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用——语法大全 JS逆向攻防对抗核心的博弈点在于对JS最基础部分的深刻理解和灵活应用&#xff0c;偏门基础用法语法知道的越多&#xff0c;理解的越深刻&#xff0c;运用的越灵活…

前端知识点

HTML、CSS 相关 1、 BFC 1、BFC 是什么&#xff1f; BFC&#xff08;Block Formatting Context&#xff09; 格式化上下文&#xff1b; 指一个独立的渲染区域&#xff0c;或者说是一个隔离的独立容器&#xff1b;可以理解为一个独立的封闭空间。无论如何不会影响到它的外面 …

贪心+后缀和,CF 1903C - Theofanis‘ Nightmare

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1903C - Theofanis Nightmare 二、解题报告 1、思路分析 我们任意一种分组其实都是若干个后缀和相加 比如我们分成了三组&#xff0c;第一组的数被加了一次&#xff0c;第二组的数被加了两次&#xff0c;第…

JDK动态代理-AOP编程

AOPTest.java&#xff0c;相当于main函数&#xff0c;经过代理工厂出来的Hello类对象就不一样了&#xff0c;这是Proxy.newProxyInstance返回的对象&#xff0c;会hello.addUser会替换为invoke函数&#xff0c;比如这里的hello.addUser("sun", "13434");会…

ceres和eigen的cmake配置

这里的eigen是用下面安装的&#xff0c; sudo apt-get install libeigen3-devceres是编译后&#xff0c;安装到系统目录下的 sudo make install这样cmake会自动到系统下去寻找eigen, ceres相关的cmake文件&#xff0c; 包含ceres和eigen引用的源文件&#xff0c;需要在CMake…

Web3 ETF 的软件开发框架

Web3 ETF 的软件开发框架主要包含以下几个方面&#xff0c;需要说明的是&#xff0c;Web3 ETF 仍处于早期发展阶段&#xff0c;相关技术和标准尚未成熟。在开发 Web3 ETF 时&#xff0c;需要谨慎评估风险&#xff0c;并做好安全防范措施。北京木奇移动技术有限公司&#xff0c;…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

【vocabulary in use (elementary)】6 Health and Illness

very well / fine 很好 ill sick 生病 I feel terrible 感觉很差 headache 头疼 toothache 牙疼 dentist medicine 药 pills 片药 caps 胶囊 aspirin 阿司匹林 antibiotic 抗生素 vitamin 维生素 painkiller 止痛药 dentist 牙医 got a cold 感冒 for many years 很多年 all th…

Channel Messaging API 的使用

Channel Messaging API 是HTML5中引入的一种高级通信机制&#xff0c;它允许在Web Workers之间&#xff0c;以及Web Workers与主线程之间建立高效、安全的双向通信通道。这一API特别适用于需要频繁交换数据或维持长期通信的场景&#xff0c;提高了Web应用的性能和灵活性。 基础…