用C++读取结构文件,但错误读取值

用C++读取结构文件,但错误读取值,c++,struct,fwrite,fread,file-header,C++,Struct,Fwrite,Fread,File Header,我写了一些代码来读取.wav文件,并做了一些算法,然后写入一个新的.wav文件。我使用一个struct来代表wav头,在将struct写入文件之前,其中的值都是正确的,但当我回读时,其中的一些值发生了变化,我不知道为什么,这是我的struct: struct WavHeader{ public: char RIFF[4]={'R','I','F','F'}; int32_t size0; char WAVE[4]=

我写了一些代码来读取.wav文件,并做了一些算法,然后写入一个新的.wav文件。我使用一个struct来代表wav头,在将struct写入文件之前,其中的值都是正确的,但当我回读时,其中的一些值发生了变化,我不知道为什么,这是我的struct:

struct WavHeader{
    public:
            char RIFF[4]={'R','I','F','F'};
            int32_t size0;
            char  WAVE[4]={'W','A','V','E'};
            char FMT[4]={'f','m','t',' '};
            int32_t size1;
            int16_t fmttag;
            int16_t channel;
            int32_t samplespersec;
            int32_t bytepersec;
            int16_t blockalign;
            int32_t bitsEvrSample;
            char DATA[4]={'d','a','t','a'};
            int32_t size2;

            WavHeader(){
                    size0=0;
                    size1=0;
                    fmttag=0;
                    channel=1;
                    samplespersec=0;
                    bytepersec=0;
                    blockalign=0;
                    bitsEvrSample=0;
                    size2=0;
            }
};
以下是我写入wavpz忽略wavpz数据的函数:

void MTools::write2Wav(const char* fname,WavData* data,WavHeader* wavhead){
    FILE* fid=fopen(fname,"ab+");
    fwrite(wavhead,1,sizeof(WavHeader),fid);
    fclose(fid);
}
最后是读取wav标题的函数:

在使用gdb写入之前:

写完并阅读后:

您将标题定义为多种类型的混合,如int16和int32。但您只读取过int16值。例如,看看samplespersec。我认为,如果您调整类型,这可能就是修复方法。

您将标题定义为类型的混合,如int16和int32。但您只读取过int16值。例如,看看samplespersec。我认为如果您调整了类型,这可能就是修复方法。

您需要像loadwav文件一样明确地重写write2wav,因为您永远不知道数据是如何打包的,所以结构中的内存对齐问题取决于编译器的编译器选项。

您需要像loadwav文件一样明确地重写write2wav,因为您永远不知道数据是如何打包的,所以结构中的内存对齐问题取决于编译器的编译器选项。

您对size0的读取有缺陷。您将两个字节读入head->size0,但它是一个32位变量。因此head->size0的实际值将取决于您的系统。更重要的是,您对大小的书写和读取不匹配。您确定WavHeader结构是您期望的大小吗?看到我是新的C++,我已经思考了1616×2=32。所以这个问题可能是由内存占用引起的?你对siZ0的阅读是有缺陷的。您将两个字节读入head->size0,但它是一个32位变量。因此head->size0的实际值将取决于您的系统。更重要的是,您对大小的书写和读取不匹配。您确定WavHeader结构是您期望的大小吗?看到我是新来C++的,我有点想过1616×2 = t32。所以这个问题可能是由内存占用引起的?我还是C++新手,很多东西需要精益,谢谢大家,给我一个教训,谢谢。我还是新来C++的,很多东西需要精益,谢谢大家,给我一个教训,谢谢。
void MTools::loadWavFile(const char* fname,WavData* ret,WavHeader* head){
    FILE* fp=fopen(fname,"rb");
    size_t result;
    if(fp){
            char id[5];
        format_length,sample_rate,avg_bytes_sec,data_size,bits_per_sample;

            result=fread(id,sizeof(char),4,fp);
            id[4]='\0';

            if(!strcmp(id,"RIFF")){

                    result=fread(&(head->size0),sizeof(int16_t),2,fp);
                    result=fread(id,sizeof(char),4,fp);
                    id[4]='\0';

                    if(!strcmp(id,"WAVE")){
                            result=fread(id,sizeof(char),4,fp);

                            result=fread(&(head->size1),sizeof(int16_t),2,fp);


                            result=fread(&(head->fmttag),sizeof(int16_t),1,fp);

                            result=fread(&(head->channel),sizeof(int16_t),1,fp);

                            result=fread(&(head->samplespersec),sizeof(int16_t),2,fp);

                            result=fread(&(head->bytepersec),sizeof(int16_t),2,fp);

                            result=fread(&(head->blockalign),sizeof(int16_t),1,fp);

                            result=fread(&(head->bitsEvrSample),sizeof(int16_t),2,fp);
                            result=fread(id,sizeof(char),4,fp);

                            result=fread(&(head->size2),sizeof(int16_t),2,fp);


                            ret->size=head->size2/sizeof(int16_t);


                            ret->data=(int16_t*)malloc(head->size2);
                            result=fread(ret->data,sizeof(int16_t),ret->size,fp);
                     }      
                    else{
                            cout<<"Error: RIFF File but not a wave file\n";
                    }       
            }       
    else{   
            cout<<"ERROR: not a RIFF file\n";
    }       
    }
    fclose(fp);

}