C++ 使用c+;读取.wav文件时出现问题+;

C++ 使用c+;读取.wav文件时出现问题+;,c++,wav,C++,Wav,我在读取WAVE文件时遇到问题。我目前正在使用本教程()来了解这些内容。 这是我代码的一部分: void loadWaveFile(char *fname, WavData *ret) { FILE* fp = fopen(fname,"rb"); if (fp) { char id[5]; unsigned long size; short format_tag, channels, block_align, bits_per_sample; unsigne

我在读取WAVE文件时遇到问题。我目前正在使用本教程()来了解这些内容。 这是我代码的一部分:

void loadWaveFile(char *fname, WavData *ret) {
FILE* fp = fopen(fname,"rb");

if (fp)  {
    char id[5];
    unsigned long size;
    short format_tag, channels, block_align, bits_per_sample;
    unsigned long format_length, sample_rate, avg_bytes_sec, data_size; 
    fread(id, sizeof(char),4,fp); 
    id[4] = '\0';

    if(!strcmp(id,"RIFF")) { 
        fread(&size, sizeof(unsigned long),1,fp); 
        fread(id, sizeof(char),4,fp); 
        id[4] = '\0';

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

            fread(id,sizeof(char),4,fp); 
            fread(&format_length, sizeof(unsigned long),1,fp);
            fread(&format_tag, sizeof(short),1,fp);
            fread(&channels, sizeof(short),1,fp);
            fread(&sample_rate, sizeof(unsigned long),1,fp);
            fread(&avg_bytes_sec, sizeof(unsigned long),1,fp);
            fread(&block_align, sizeof(short),1,fp);
            fread(&bits_per_sample, sizeof(short),1,fp); 
            fread(id,sizeof(char),4,fp); 
            fread(&data_size, sizeof(unsigned long),1,fp); 

            ret->size = data_size/sizeof(short);
            ret->data =(short*) malloc(data_size);
            fread(ret->data, sizeof(short), ret->size,fp);

        }
        else {
            std::cout<<"Error: RIFF Datei, aber keine wave Datei\n";
        }
    }
    else {
        std::cout<<"Error: keine RIFF Datei\n";
    }
}
else {
    std::cout<<"Error: keine Datei ausgewaehlt\n";
}
fclose(fp); 
void加载波形文件(char*fname,WavData*ret){
文件*fp=fopen(fname,“rb”);
if(fp){
字符id[5];
无符号长尺寸;
短格式标签、通道、块对齐、每个采样位;
无符号长格式长度、采样率、平均字节数秒、数据大小;
fread(id,sizeof(char),4,fp);
id[4]='\0';
如果(!strcmp(id,“RIFF”){
fread(&size,sizeof(无符号长),1,fp);
fread(id,sizeof(char),4,fp);
id[4]='\0';
如果(!strcmp(id,“WAVE”){
fread(id,sizeof(char),4,fp);
fread(&format_length,sizeof(无符号长),1,fp);
fread(格式标签,大小(短),1,fp);
fread(和频道,sizeof(短),1,fp);
fread(&采样率,sizeof(无符号长),1,fp);
fread(&avg_bytes_sec,sizeof(无符号长),1,fp);
fread(&block_align,sizeof(short),1,fp);
fread(&bits_/u样本,sizeof(short),1,fp);
fread(id,sizeof(char),4,fp);
fread(&数据大小,sizeof(无符号长),1,fp);
ret->size=数据大小/sizeof(短);
ret->data=(短*)malloc(数据大小);
fread(ret->data,sizeof(short),ret->size,fp);
}
否则{

std::coutYou假设
sizeof(unsigned long)==4
-这不能保证(它不能小于4字节,但可能更大)。只读取文件的前12个字节,然后测试
if(strncmp(buf,“RIFF”,4)==0&&strncmp(buf+8,“WAVE”,4)==0)
只是出于好奇,你有没有考虑过使用库?使用libsndfile会容易得多。(@csnate libsndfile有一个许可证,对于商业产品来说可能会有问题。我认为它对于iOS应用程序也不可用。(这并不是说你不应该推荐现有的库,只是如果它们有非自由的许可证,那么值得一提。)在需要固定大小或最小大小类型的地方使用