用C++读取结构文件,但错误读取值
我写了一些代码来读取.wav文件,并做了一些算法,然后写入一个新的.wav文件。我使用一个struct来代表wav头,在将struct写入文件之前,其中的值都是正确的,但当我回读时,其中的一些值发生了变化,我不知道为什么,这是我的struct:用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]=
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);
}