关于大数据文件读取有关问题-新手求教
关于大数据文件读取问题-新手求教~
各位前辈大家好!本人在做导师项目的时候遇到这样的问题:波形文件为顺序存储,每个测试点存储一帧数据,每帧数据为2048字节,每个波形文件为相邻测试点波形数据的连续存储而成,数据的结构体定义见后面的代码,然后文件最小的大概100多兆,二进制格式的(这是数据文件的提供者说的,但是又不是常见的.dat文件,文件后缀是他们写的.uda,不懂),现在的任务是读取文件中的波形数据,见结构体中的红色行,我只有一点自己空余时间看的C++的基础,之前试了论坛上的fopen和faread等常见的文件读取方法,均没有成功,在这里恳请各位前辈们不吝赐教!不甚感谢!
结构体定义如下:
typedef struct _CHAN_DATA {
//0-7
UCHAR m_uacRsv1[8];
//8-15
USHORT usRotaryVal;
UCHAR ucRotarySel;
UCHAR ucDemoduSel;
USHORT usRotaryErr;
UCHAR m_uacRsv2[2];
//16-23
USHORT usVel2;
UCHAR m_uacRsv3[6];
//24-31
ULONG ulDepthCoder;
ULONG ulDepthReal;
//32-39
ULONG ulRepeat;
SHORT nTraction;
SHORT nGain;
//40-47
ULONG ulThick;
ULONG ulWellThick;
//48-63
USHORT usPosThick1;
USHORT usPosThick2;
USHORT usPosThick3;
USHORT usPosThick4;
USHORT usGateS;
USHORT usGateW;
UCHAR m_uacRsv6[4];
//64-2031
UCHAR uacData[1968]; //要读取的波形数据
//2032-2039
ULONG ulEchoStart;
UCHAR ucAmp;
UCHAR ucGateHigh;
UCHAR m_uacRsv7[2];
//2040-2048
UCHAR m_uacRsv10[8];
} UDA_CHAN_DATA;
------解决思路----------------------
仅供参考:
------解决思路----------------------
关键点是,将那个结构体进行1字节对齐!
即上面所做的方法
然后再读读试试。
各位前辈大家好!本人在做导师项目的时候遇到这样的问题:波形文件为顺序存储,每个测试点存储一帧数据,每帧数据为2048字节,每个波形文件为相邻测试点波形数据的连续存储而成,数据的结构体定义见后面的代码,然后文件最小的大概100多兆,二进制格式的(这是数据文件的提供者说的,但是又不是常见的.dat文件,文件后缀是他们写的.uda,不懂),现在的任务是读取文件中的波形数据,见结构体中的红色行,我只有一点自己空余时间看的C++的基础,之前试了论坛上的fopen和faread等常见的文件读取方法,均没有成功,在这里恳请各位前辈们不吝赐教!不甚感谢!
结构体定义如下:
typedef struct _CHAN_DATA {
//0-7
UCHAR m_uacRsv1[8];
//8-15
USHORT usRotaryVal;
UCHAR ucRotarySel;
UCHAR ucDemoduSel;
USHORT usRotaryErr;
UCHAR m_uacRsv2[2];
//16-23
USHORT usVel2;
UCHAR m_uacRsv3[6];
//24-31
ULONG ulDepthCoder;
ULONG ulDepthReal;
//32-39
ULONG ulRepeat;
SHORT nTraction;
SHORT nGain;
//40-47
ULONG ulThick;
ULONG ulWellThick;
//48-63
USHORT usPosThick1;
USHORT usPosThick2;
USHORT usPosThick3;
USHORT usPosThick4;
USHORT usGateS;
USHORT usGateW;
UCHAR m_uacRsv6[4];
//64-2031
UCHAR uacData[1968]; //要读取的波形数据
//2032-2039
ULONG ulEchoStart;
UCHAR ucAmp;
UCHAR ucGateHigh;
UCHAR m_uacRsv7[2];
//2040-2048
UCHAR m_uacRsv10[8];
} UDA_CHAN_DATA;
------解决思路----------------------
仅供参考:
#include <stdio.h>
#include <string.h>
#include <windows.h>
#pragma pack(push)
#pragma pack(1)
typedef struct _CHAN_DATA {
//0-7
UCHAR m_uacRsv1[8];
//8-15
USHORT usRotaryVal;
UCHAR ucRotarySel;
UCHAR ucDemoduSel;
USHORT usRotaryErr;
UCHAR m_uacRsv2[2];
//16-23
USHORT usVel2;
UCHAR m_uacRsv3[6];
//24-31
ULONG ulDepthCoder;
ULONG ulDepthReal;
//32-39
ULONG ulRepeat;
SHORT nTraction;
SHORT nGain;
//40-47
ULONG ulThick;
ULONG ulWellThick;
//48-63
USHORT usPosThick1;
USHORT usPosThick2;
USHORT usPosThick3;
USHORT usPosThick4;
USHORT usGateS;
USHORT usGateW;
UCHAR m_uacRsv6[4];
//64-2031
UCHAR uacData[1968]; //要读取的波形数据
//2032-2039
ULONG ulEchoStart;
UCHAR ucAmp;
UCHAR ucGateHigh;
UCHAR m_uacRsv7[2];
//2040-2048
UCHAR m_uacRsv10[8];
} UDA_CHAN_DATA;
#pragma pack(pop)
FILE *f;
int n,r;
UDA_CHAN_DATA ucd;
long offset;
void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
int main() {
f=fopen("test.uda","rb");
if (NULL==f) {
printf("Can not open file test.uda!\n");
return 1;
}
n=0;
while (1) {
r=fread((void *)&ucd,sizeof(UDA_CHAN_DATA),1,f);
if (1==r) {
printf("-------------%d------------\n",n);
HexDump((char *)(ucd.uacData),1968,0);
n++;
} else break;
}
fclose(f);
return 0;
}
------解决思路----------------------
关键点是,将那个结构体进行1字节对齐!
即上面所做的方法
#pragma pack(push)
#pragma pack(1)
将结构体放在这里
#pragma pack(pop)
其它代码。
然后再读读试试。