所以我试着读取一个wav文件的标题,由于某些原因我只能阅读它的一部分。
我使用这种结构来存储数据:
struct WaveHeaderType
{
char chunkId[4];
unsigned long chunkSize;
char format[4];
char subChunkId[4];
unsigned long subChunkSize;
unsigned short audioFormat;
unsigned short numChannels;
unsigned long sampleRate;
unsigned long bytesPerSecond;
unsigned short blockAlign;
unsigned short bitsPerSample;
char dataChunkId[4];
unsigned long dataSize;
};
和这段代码来读取文件:
WaveHeaderType waveFileHeader;
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
之后只有chunkId,chunkSize,format和subChunkId有值,其余的只是null。我究竟做错了什么?或者我碰巧有一个损坏的wav文件? (我可以毫无问题地在kmplayer中播放wav文件)
答案 0 :(得分:4)
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
可能就是你的意思。随着&它将是一个指针的大小,所以你只读4或8个字节。
还要考虑在结构上使用某种#pragma pack,除非你从官方标题中获得它,成员之间的pading可能会导致与文件中不同的布局。
答案 1 :(得分:2)
而不是sizeof(&waveFileHeader)
您需要撰写sizeof(waveFileHeader)
sizeof(&waveFileHeader)
在32位系统中给出一个恒定的4个字节(指针大小)。
sizeof(waveFileHeader)
给出waveFileHeader
struct
答案 2 :(得分:0)
您想要读取结构的大小sizeof(waveFileHeader)
。
使用&
,您将读取指向waveFileHeader的元素大小。
尝试:
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
答案 3 :(得分:0)
除了上面提到的“将指针的大小与结构的大小不同”之外,当我看到数据结构中的unsigned long
应该存储在文件中时,我会非常担心(或从文件中读取)。这正是将代码从32位环境移动到64位环境时(或从一个编译器移动到另一个编译器,或使用相同的编译器,但在不同的处理器类型上)出错的类型。
您应该使用尺寸定义的类型,例如uint8_t
,uint16_t
,uint32_t
等。
答案 4 :(得分:0)
使用您正在执行的固定结构可以处理许多WAV文件,但文件头中可能有其他元素,并且某些字段可能具有不同的大小。有一系列以mmioOpen开头的API函数,您可以使用它来解析文件,如下所示:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743664(v=vs.85).aspx