结构体数组保存进二进制文件的简单做法

news2024/12/23 14:55:29

作者:朱金灿
来源:clever101的专栏

为什么大多数人学不会人工智能编程?>>> hot3.png

  最近面临这样一个需求:以比较节省存储空间的存储一组坐标点到文件,要求程序能够跨平台读写这种文件。思考了一下,比较简单的方式是以二进制文件的方式保存,先存入点的个数,然后把点结构体逐个存储进去。因为要节省存储空间,得保证结构体是以单字节对齐的。代码如下:



#include <stdio.h>
#include <string>
#include <vector>


/* 对齐结构成员到1字节 */
#ifdef __GNUC__
#define GNUC_PACKED __attribute__((packed))
#else
#define GNUC_PACKED
#endif
#ifdef __arm 
#define ARM_PACKED  __packed 
#else 
#define ARM_PACKED 
#endif
#if defined(_WIN32) || defined(_WIN64)
#pragma pack(1)
#endif
ARM_PACKED

/*
坐标点结构体
*/
struct  stPointCoodinate
{
	double m_CoodinateX;  //x坐标
	double m_CoodinateY;  //y坐标
};

#if defined(_WIN32) || defined(_WIN64)
#pragma pack()
#endif

/*
将点结构体转化为二进制文件
具体是先写入点的数目,然后再逐个写入点
*/
int WritePointsToFile(const std::vector<stPointCoodinate>& vecTarget, const std::string& binFile)
{
	if (vecTarget.empty())
	{
		printf("point number is 0\n");
		return -1;
	}

	FILE* fp = fopen(binFile.c_str(), "wb");
	if (NULL == fp)
	{
		printf("create point file failed!\n");
		return -2;
	}
	int nTargetNum = vecTarget.size();
	fwrite(&nTargetNum, sizeof(int), 1, fp);
	fwrite(&vecTarget[0], sizeof(stPointCoodinate), nTargetNum, fp);

	fclose(fp);

	return 0;
}

/*
从文件中读入点数据
*/
int ReadPointsFromFile(const std::string& binFile, std::vector<stPointCoodinate>& vecTarget)
{
	FILE* fp = fopen(binFile.c_str(), "rb");
	if (NULL == fp)
	{
		printf("point file open failed!\n");
		return -1;
	}
	int nTargetNum = 0;
	fread(&nTargetNum, sizeof(int), 1, fp);
	vecTarget.resize(nTargetNum);
	fread(&vecTarget[0], sizeof(stPointCoodinate), nTargetNum, fp);

	fclose(fp);

	return 0;
}

/*
测试点文件的读写
*/
void TestPointFileRW()
{
	std::vector<stPointCoodinate> vecTarget;
	for (int i = 0; i < 5; i++)
	{
		stPointCoodinate pt;
		pt.m_CoodinateX = 100.0 + i * 10.0;
		pt.m_CoodinateY = 100.0 + i * 10.0;
		vecTarget.push_back(pt);
	}

#if defined(_WIN32) || defined(_WIN64)

	std::string binFile = "D:\\TestData\\test_point.pt";

#else

	std::string binFile = "/home/lx/TestData/test_point.pt";

#endif

	int ret = WritePointsToFile(vecTarget, binFile);

	vecTarget.clear();

	ret = ReadPointsFromFile(binFile, vecTarget);

	if (!vecTarget.empty())
	{
		int num = vecTarget.size();
		for (int i = 0; i < num; i++)
		{
			printf("%f,%f \n", vecTarget[i].m_CoodinateX, vecTarget[i].m_CoodinateY);
		}
	}
}

int main(int argc, char* argv[])
{
	TestPointFileRW();

	getchar();
    return 0;
}

windows效果图如下:
windows效果图

linux效果图如下:
linux效果图

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

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

相关文章

2023年北京市安全员-A证证模拟考试题库及北京市安全员-A证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年北京市安全员-A证证模拟考试题库及北京市安全员-A证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;北京市安全员-A证证模拟考试题库是根据北京市安全员-A证最新版教材&#xff0c;北京市安全员-A证大…

Linux基本指令及周边(第一弹)

文章目录 前言mkdir指令&#xff08;重要&#xff09;&#xff1a;tree指令rmdir指令 && rm 指令(重要&#xff09;&#xff1a;touch指令ls指令pwd指令cd 指令用户家目录man指令&#xff08;重要&#xff09;&#xff1a;mv指令&#xff08;重要&#xff09;cat指令绝…

腾讯云服务器秒杀什么时候开始?腾讯云服务器秒杀时间

腾讯云服务器秒杀什么时候开始呢&#xff1f;我们一起来揭晓答案&#xff01; 腾讯云服务器秒杀活动即日起至2023-11-30 23:59:59&#xff0c;每日0点限量秒杀。这意味着&#xff0c;每一天的开始&#xff0c;你都有机会抢到心仪的服务器。秒杀活动入口&#xff1a;https://te…

使用Ant Design Pro开发时的一个快速开发接口请求的技巧

使用Ant Design Pro开发时的一个快速开发接口的技巧 当我们的后端在写好接口以后&#xff0c;我们通过swagger knife4j可以生成一个接口文档&#xff0c;后端启动以后&#xff0c;可以生成一个接口文档&#xff0c;当输入地址 localhost:8101/api/v3/api-docs &#xff08;这…

image图片之间的间隙消除

多个图片排列展示&#xff0c;水平和垂直方向的间隔如何消除 垂直方向 vertical-align 原因&#xff1a; vertical-align属性主要用于改变行内元素的对齐方式&#xff0c;行内元素默认垂直对齐方式是基线对齐&#xff08;baseline&#xff09; 这是因为图片属于行内元素&…

CFI(Common Flash Interface)简介

CFI定义了符合CFI规则设备的基本Query接口&#xff0c;包括已知或待拟定的flash Read/Write/Program/Erase控制接口。Query接口以结构体形式定义与flash设备相关的关键参数&#xff0c;但是CFI不会对单个flash设备厂家指定详细的指令集、状态轮询模式以及软件算法。 1.操作概要…

业务流程图用什么软件画?这10款流程图软件,好用到飞起!

业务流程图是什么&#xff1f; 业务流程图是一种用于表示业务过程中活动流向的图形表示方法&#xff0c;它使用标准化的图形元素&#xff08;如箭头、椭圆、方框等&#xff09;来表达一个过程中各个环节之间的关系。在这个图形表示中&#xff0c;每个元素都有特定的含义和功能…

【华为OD机试高分必刷题目】神奇的卡片(C++等差数列实现)

&#x1f680;你的旅程将在这里启航&#xff01;本专栏所有题目均包含优质解题思路&#xff0c;高质量解题代码&#xff0c;详细代码讲解&#xff0c;助你深入学习&#xff0c;高分通过&#xff01; 文章目录 【华为OD机试高分必刷题目】神奇的卡片&#xff08;C等差数列实现&a…

代码随想录算法训练营第二十五天| 216 组合总合 ||| 17 电话号码的字母组合

216 组合总和 ||| 暴力 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>newList new ArrayList<>();public List<List<Integer>> combinationSum3(int k, int n) {soluHelper(1,k,n,0);return res;}pr…

如何使用ONLYOFFICE来P惊悚特效图

如何使用ONLYOFFICE来P惊悚特效图 老朋友们可能会经常看见本号主又换头像了&#xff0c;各种各样精神分裂成一群人或者我和自己俩个人的头像&#xff0c;之前讲过的&#xff1a; 手把手教你如何自己一个人精神分裂成一群人https://mp.weixin.qq.com/s/yacKt7N3sZnarfMhXRNdBA…

Kafka 集群实现数据同步

Kafka 介绍 Kafka 是一个高吞吐的分布式消息系统&#xff0c;不但像传统消息队列&#xff08;RaabitMQ、RocketMQ等&#xff09;那样能够【异步处理、流量消峰、服务解耦】 还能够把消息持久化到磁盘上&#xff0c;用于批量消费。除此之外由于 Kafka 被设计成分布式系统&…

Docker在Centos7下的安装

1、卸载旧版本 执行如下指令对旧版本进行卸载&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 执行完毕后&#xff0c;如果输入docker version发现do…

【解疑】ZIP压缩包的密码可以取消吗?

ZIP是工作中经常用到的文件压缩格式&#xff0c;它可以将多个文件压缩成一个文件&#xff0c;便于传输和存储。有时候&#xff0c;为了保护文件的私密性&#xff0c;很多人还会在压缩文件的同时设置密码保护。那问题来了&#xff0c;要是后续不需要保护了&#xff0c;ZIP压缩包…

Elasticsearch备份与还原:使用elasticdump

在数据管理的世界里&#xff0c;备份和还原数据是重中之重的日常工作&#xff0c;特别是对于Elasticsearch这样的强大而复杂的搜索引擎。备份不仅可以用于灾难恢复&#xff0c;还可以在数据迁移、测试或者升级等场景中发挥重要作用。 在本博客中&#xff0c;我们将会重点介绍如…

基于SSM的大学餐厅菜品推荐和点评系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Linux系统下安装go

目录 下载go安装包解压包并安装添加环境变量验证是否安装成功 下载go安装包 官网地址&#xff1a;go 解压包并安装 复制好包的下载链接后使用下面命令进行安装&#xff1a; curl -O https://storage.googleapis.com/golang/go1.11.1.linux-amd64.tar.gz mkdir -p ~/installe…

为什么要写测试用例,测试用例写给谁看?

“为什么要编写测试用例&#xff0c;测试用例写给谁看”&#xff0c;这个问题看似简单&#xff0c;但却涵盖了一系列复杂的考虑因素&#xff0c;并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”&#xff0c;我将通过以下3个方面进行展开&…

.Net 8正式发布

Net 8是官方号称有史以来性能最快的一个版本了。 .Net 8 增加了数以千计的性能、稳定性和安全性改进&#xff0c;以及平台和工具增强功能&#xff0c;有助于提高开发人员的工作效率和创新速度。 反正就是快&#xff0c;性能好、工作效率更高&#xff01; 这个版本&#xff0c…

腾讯云服务器怎么买便宜?腾讯云服务器优惠链接

现在&#xff0c;让我们一起探索如何在腾讯云服务器上购买便宜的云服务器吧&#xff01; 首先&#xff0c;我们来看看都有哪些便宜的腾讯云服务器值得我们入手吧&#xff01; 首先是轻量2核2G3M服务器&#xff0c;只需要一年88元就能轻松拥有&#xff0c;对于刚开始接触云服务…

mtgsig1.2简单分析

{"a1": "1.2", # 加密版本"a2": new Date().valueOf() - serverTimeDiff, # 加密过程中用到的时间戳. 这次服主变坏了, 时间戳需要减去一个 serverTimeDiff(见a3) ! "a3": "这是把xxx信息加密后提交给服务器, 服主…