读波头c ++

时间:2013-06-20 13:02:02

标签: c++ wav

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

5 个答案:

答案 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_tuint16_tuint32_t等。

答案 4 :(得分:0)

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

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