这可能是一个比较基础的问题,但由于刚开始学习c++,但是对我来说,结构体快速从二进制文件读取数据,给我解决了很大的问题,这里我把方法写出来,和有需要的人分享一下,高手看到了请多包涵。
我的二进制文件是按照结构体规定的格式进行存储的,结构体成员比较多,数据量比较大。结构体结构如下:
-
-
struct MY_PARAM{
-
int m_atten;
-
double m_vbw, m_rbw;
-
double m_refPower, m_markerPower;
-
double m_centerFreqMHz, m_spanMHz, m_startFreqMHz, m_stopFreqMHz, m_markerFreqMHz;
-
double m_span, m_sweep;
-
int m_spectrum_points;
-
int m_iData[1024];
-
};
读取二进制文件时,如果按照一个数据一个数据去读的话,需要编写非常多重复的代码,执行效率也比较慢。于是我就想有没有办法可以吧从二进制文件读取的数据按照格式直接存放到结构体所在的内存,刚开始我打算用指针,进行内存拷贝,但是尝试了很久没有成功,因为QDataStream好像不支持内存拷贝(个人看法,可能使用方法不对)。
然后我就想其它办法,打算用容器实现,翻书进行查找的时候,突然翻到了共用体,然后就按照书上给的例子进行尝试,最后尝试成功。代码如下:
-
//#pragma pack(push)
-
//#pragma pack(1)
-
union FILE_READBUFFER{
-
MY_PARAM m_param;
-
char header_pt[sizeof(m_param)];
-
};
-
//#pragma pack(pop)
共用体定义如上,内容很简单,就是包含一个结构体和一个char类型的数组,大小和结构体的大小相同。其中
-
-
//#pragma pack(1)
-
……
-
//#pragma pack(pop)
这几句是定义内存对其方式的,这个需要和保存文件时的对其方式进行对应,括号中1就是1字节对其,4就是四字节对齐,本来我打算用1字节对其,结果发现读取的部分数据错误,后来就把这几句注释掉了,按照默认格式进行对其,结果没有错误。
从二进制文件读取数据,然后直接赋值给结构体的代码如下:
-
QString filename=QFileDialog::getOpenFileName( this,tr("Open Files"),"",tr("Files(*.dat)"));
-
ReadDataFile(filename);
-
QFile myfile(filename);
-
myfile.open(QIODevice::ReadOnly);
-
QDataStream myfile_data(&myfile);
-
FILE_READBUFFER app_file_readbuffer;
-
myfile_data.readRawData(app_file_readbuffer.header_pt, sizeof(app_readbuffer));
这样就完成了全部的从二进制文件读取数据并把值赋给结构体,后面就可以使用结构体中的数据了。
代码进行过删减,可能部分地方有错误,有需要的朋友可以按照我这个思路自己编程进行验证。