0

所以我试图读取 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 文件)

4

5 回答 5

4
fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);

大概就是你的意思。使用 & 它将是指针的大小,因此您只需读取 4 或 8 个字节。

还可以考虑在结构上使用某种#pragma 包,除非您从官方标题中获得它,成员之间的填充可能会导致与文件中不同的布局。

于 2013-06-20T13:04:20.680 回答
2

而不是sizeof(&waveFileHeader)你需要写sizeof(waveFileHeader)

sizeof(&waveFileHeader)在 32 位系统中给出恒定的 4 个字节(指针大小)。

sizeof(waveFileHeader)给出waveFileHeaderstruct的字节大小

于 2013-06-20T13:05:03.913 回答
0

使用您正在做的固定结构可以适用于许多 WAV 文件,但文件头中可能有其他元素,并且某些字段的大小可能不同。有一系列以 mmioOpen 开头的 API 函数,您可以使用它们来解析文件,如下所示:

http://msdn.microsoft.com/en-us/library/windows/desktop/dd743664(v=vs.85).aspx

于 2013-06-20T14:50:45.377 回答
0

除了上面提到的“获取指针的大小与结构的大小不同”之外,当我看到unsigned long应该存储在文件中(或从文件中读取)的数据结构时,我很担心。这正是将代码从 32 位环境移动到 64 位环境(或从一个编译器移动到另一个编译器,或使用相同的编译器,但在不同的处理器类型上)时出错的类型。

您应该使用大小定义的类型,例如uint8_t, uint16_t,uint32_t等。

于 2013-06-20T13:31:40.600 回答
0

您想读取结构的大小,即sizeof(waveFileHeader).

随着&您将读取指向 waveFileHeader 的元素的大小。

尝试:

fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr);
于 2013-06-20T13:06:55.297 回答