你好,我有一个大学项目阅读Wav文件与任何语言可能,所以我选择了C/c++我想我得到了一切正确的,但我一直在工作的一件事在c项目中我总是得到这个msg "Buffer != NULL"
完整代码:
int main (){
//char id[10];
FILE *wav;
wav=fopen("sound.wav","rb");
if(wav){
BYTE wav_id[5], *sound_buffer;
DWORD size;
short format_tag, channels, block_align, bits_per_sample;
DWORD format_length, sample_rate, avg_bytes_sec,datasize,i;
fread(&wav_id,sizeof(BYTE),4,wav);
wav_id[sizeof(BYTE)+3]=0;
if (!memcmp(&wav_id,"RIFF",4)) {
fread(&size,sizeof(DWORD),1,wav);
fread(&wav_id,sizeof(BYTE),4,wav);
if (!memcmp(&wav_id,"WAVE",4)) { //this is probably a wave file since it contained "WAVE"
fread(&wav_id,sizeof(BYTE),4,wav); //read in 4 bytes "fmt ";
fread(&format_length,sizeof(DWORD),1,wav);
fread(&format_tag, sizeof(short), 1, wav);
fread(&channels, sizeof(short),1,wav);
fread(&sample_rate, sizeof(DWORD), 1, wav);
fread(&avg_bytes_sec, sizeof(short), 1, wav);
fread(&block_align, sizeof(short), 1, wav);
fread(&bits_per_sample, sizeof(short), 1, wav);
fread(&wav_id, sizeof(BYTE), 4, wav); //read in 'data'
fread(&datasize, sizeof(DWORD), 1, wav); //how many bytes of sound data we
sound_buffer=(BYTE *)malloc(sizeof(BYTE) * datasize);
fread(sound_buffer, sizeof(BYTE), datasize, wav); // i trace the problem to this line the whole above code seems to run smooth
}
cout << "n The file is Riff but it's not a wav file"<<endl;
}
else {
cout <<"nNOT a Wav Filen"<<endl;}
}
else {
cout <<"nFile wasn't openedn"<<endl;
}
system("pause");
}
错误显示-
Error 2 error C2664: 'strcmp' : cannot convert parameter 1 from 'BYTE [5]' to 'const char *'
不能将BYTE [5]
数据类型传递给字符串比较函数。它对原型无效。语法——
int strcmp(const char *s1, const char *s2);
两个参数都必须是字符串!
但是你正在把wav_id
传递给strcmp
。我认为它不是字符串-
strcmp(wav_id,"RIFF") // problem
strcmp(wav_id,"WAVE") // problem
否则,您可以使用memcmp
来比较内存位置。原型是——
int memcmp(const void *s1, const void *s2, size_t n);
两个参数都是void *
,所以你可以把任何类型的指针传递给这个函数!
尝试以下更改-
if (!memcmp(&wav_id,"RIFF",4)) {
fread(&size,sizeof(DWORD),1,wav);
fread(&wav_id,sizeof(BYTE),4,wav);
if (!memcmp(&wav_id,"WAVE",4))
... }
将WAVE音频id视为整数更容易。比如uint32_t
。然后,您可以参考ASCII表来定义一些常量:
const uint32_t RIFF_ID = 0x46464952;
记住WAVE音频是一个小的尾端格式。
然后您可以直接读取uint32_t
变量并简单地与==
进行比较。
关于另一个问题,fread
中的断言失败,很可能datasize
是一个非常大的值,对malloc
的调用失败,返回NULL
。当您传递NULL
作为fread
的缓冲区时,CRT的调试版本会检测到该问题。添加一些错误检查。调用malloc
而不检查返回值是否有错误是错误的。
您可以使用memcmp
但是对于c++,我会使用这样的
template <char a, char b, char c, char d>
struct NUMBER {
enum {
value = a +
(static_cast<uint32_t> (b) << 8) +
(static_cast<uint32_t> (c) << 16) +
(static_cast<uint32_t> (d) << 24) };
};
...
uint32_t data;
fread(&data,sizeof(uint32_t),1,wav)
if ( data != NUMBER<'R', 'I', 'F', 'F'>::value) // "RIFF"
return -1; //Not RIFF