关于大数据文件读取有关问题-新手求教

关于大数据文件读取问题-新手求教~
各位前辈大家好!本人在做导师项目的时候遇到这样的问题:波形文件为顺序存储,每个测试点存储一帧数据,每帧数据为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)

其它代码。


然后再读读试试。