这可能是一个比较基础的问题,但由于刚开始学习c++,但是对我来说,结构体快速从二进制文件读取数据,给我解决了很大的问题,这里我把方法写出来,和有需要的人分享一下,高手看到了请多包涵。
我的二进制文件是按照结构体规定的格式进行存储的,结构体成员比较多,数据量比较大。结构体结构如下:

  1. struct MY_PARAM{
  2. int     m_atten;
  3. double  m_vbw, m_rbw;
  4. double  m_refPower, m_markerPower;
  5. double  m_centerFreqMHz, m_spanMHz, m_startFreqMHz, m_stopFreqMHz, m_markerFreqMHz;
  6. double  m_span, m_sweep;
  7. int     m_spectrum_points;
  8. int     m_iData[1024];
  9. };

读取二进制文件时,如果按照一个数据一个数据去读的话,需要编写非常多重复的代码,执行效率也比较慢。于是我就想有没有办法可以吧从二进制文件读取的数据按照格式直接存放到结构体所在的内存,刚开始我打算用指针,进行内存拷贝,但是尝试了很久没有成功,因为QDataStream好像不支持内存拷贝(个人看法,可能使用方法不对)。
然后我就想其它办法,打算用容器实现,翻书进行查找的时候,突然翻到了共用体,然后就按照书上给的例子进行尝试,最后尝试成功。代码如下:

  1. //#pragma pack(push)
  2. //#pragma pack(1)
  3. union FILE_READBUFFER{
  4. MY_PARAM m_param;
  5. char header_pt[sizeof(m_param)];
  6. };
  7. //#pragma pack(pop)

共用体定义如上,内容很简单,就是包含一个结构体和一个char类型的数组,大小和结构体的大小相同。其中

  1. #pragma pack(push)
  2. //#pragma pack(1)
  3. ……
  4. //#pragma pack(pop)

这几句是定义内存对其方式的,这个需要和保存文件时的对其方式进行对应,括号中1就是1字节对其,4就是四字节对齐,本来我打算用1字节对其,结果发现读取的部分数据错误,后来就把这几句注释掉了,按照默认格式进行对其,结果没有错误。
从二进制文件读取数据,然后直接赋值给结构体的代码如下:

  1. QString filename=QFileDialog::getOpenFileName(this,tr("Open Files"),"",tr("Files(*.dat)"));
  2. ReadDataFile(filename);
  3. QFile myfile(filename);
  4. myfile.open(QIODevice::ReadOnly);
  5. QDataStream myfile_data(&myfile);
  6. FILE_READBUFFER app_file_readbuffer;
  7. myfile_data.readRawData(app_file_readbuffer.header_pt,sizeof(app_readbuffer));

这样就完成了全部的从二进制文件读取数据并把值赋给结构体,后面就可以使用结构体中的数据了。
代码进行过删减,可能部分地方有错误,有需要的朋友可以按照我这个思路自己编程进行验证。

转载于:https://www.cnblogs.com/myclassok/p/9604586.html

在QT中结构体快速从二进制文件中读取数据相关推荐

  1. java中结构体入参_JNA中自定义结构体如何传参?

    1.先给出C的头文件里的结构体: typedef struct DetectionZone { Zone zone; DetectionZoneParam param; } DetectionZone ...

  2. matlab中结构体的定义,matlab中怎么定义结构体啊 !!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 STRUCT Create or convert to structure array. S = STRUCT('field1',VALUES1,'fie ...

  3. linux结构体转qbytearray,QByteArray储存二进制数据(包括结构体,自定义QT对象)

    因为利用QByteArray可以很方便的利用其API对内存数据进行访问和修改, 构建数据库blob字段时必不可少; 那如何向blob内写入自定义的结构体和类 //自定义person结构体 typede ...

  4. C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题?

    C语言定义了一个结构体怎么分配内存?C\C++中结构体变量与结构体指针内存分配问题? 问题1:结构体指针最开始怎么分配内存?用sizeof()是不能确定大小的. 问题2:给结构体变量分配之后,是否还要 ...

  5. C 语言中结构体强制转换--实验

    2019独角兽企业重金招聘Python工程师标准>>> 对于C语言中结构体强制转换做了如下实验, 或许可以解惑一些问题 对于结构体, 我理解的属性有: 成员的顺序, 成员的类型,成员 ...

  6. c#中结构体和类的比较

    前几天,有位同学问我它们用起来有什么区别,当时也不大清楚,糊弄过去了,但是,人不能自欺欺人,不能连自己的无知也要糊弄! 翻了下书,总结一下. 区别: 结构是一种用关键字struct声明的自定义数据类型 ...

  7. c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)

    我这有个结构体: VENC_CHN_ATTR_S venc_chn_attr; /* the attribute of the venc chnl*/ typedef struct rkVENC_CH ...

  8. C中结构体的存储分配

    对于C语言中结构体所占的存储空间的大小,也一直是笔试面试的常客,今天好好看了一下这方面,以前一直以为很清楚了,今天通过各种实际测试举例,发现原来还是没有搞透彻,好在现在是彻底懂了,所以和大家分享,希望 ...

  9. c语言实现结构体变量private,C语言中结构体变量私有化详解

    背景介绍 操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate ...

最新文章

  1. AI战“疫“之路:​揭秘高精准无感测温系统的全栈AI 技术
  2. 迪拜测试世界上首款自动驾驶出租车,距离2030年的自动驾驶目标又进一步
  3. python 爬虫ip代理
  4. ZYNQ 调试遇到的问题
  5. linux命令(一)查看进程的线程数top,ps
  6. Win11应用商店怎么更新新版?应用商店更新教程
  7. hashmap扩容机制 jdk1.7
  8. Firefox必备的24款web开发插件
  9. Redis Lua脚本
  10. 深入理解GBDT回归算法
  11. Halcon测量圆直径(半径)的方法之暴力拟合法 vs 测量工具法
  12. opencv与PIL处理图像视频
  13. 基于Tensorflow实现声纹识别
  14. 有汇源上下界最大流和最小流
  15. 关于SCO Unix 串口通讯
  16. C++ 类的交叉引用
  17. 【进制转换】负进制转换 多进制转换
  18. 会声会影2022视频编辑软件专业版
  19. 前身北京计算机学院,这5所“低调到隐形”的211大学,不仅分数低,还好考
  20. 模块参考资料-硬件资料-Air820UG-功耗指标

热门文章

  1. Automatic Summarization of Bug Reports
  2. 最长上升子序列(LIS)
  3. PHP中IP地址与整型数字互相转换详解
  4. Android 动态Tab分页效果实现
  5. XHTML基础问答-给初学者
  6. 算法学习:计算几何旋转卡壳
  7. ASP.NET CORE 入门教程(附源码)
  8. selenium中的对文本进行全选,复制,粘贴,剪切和删除的操作
  9. 苏宁易购11.11:商品详情系统架构设计
  10. Java基础08 继承