2013-06-20 107 views
0

所以即时通讯尝试读取wav文件的标题,出于某种原因,我只能阅读它的一部分。使用阅读波头C++

林这样的结构来存储数据:

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); 

并在此之后仅块ID,CHUNKSIZE,格式和subChunkId具有值,其余的只是空。我究竟做错了什么?或者我只是碰巧有一个损坏的wav文件? (我可以在kmplayer中播放wav文件没有问题)

+0

你做到以二进制方式打开文件,不是吗? – rodrigo

回答

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

可能是你的意思。与&它将是一个指针的大小,所以你只读了4或8字节。

另外考虑在结构上使用某种#pragma pack,除非你在官方头文件中使用它,成员之间的压缩可能会导致与文件中不同的布局。

+0

我不知道那是怎么到的,不应该是一个指针。但是这根本不能解决问题。 (指针来自一个较早的版本,我试图搞砸了一点,但那的确是错误的方向) – Anderiel

2

代替sizeof(&waveFileHeader)需要编写sizeof(waveFileHeader)

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

sizeof(waveFileHeader)waveFileHeader结构

+0

我不知道那是怎么到的,不应该是一个指针。但是这根本不能解决问题。(指针是从一个早期的版本,我试图搞砸了一点,但这确实是错误的方向) – Anderiel

0

你想读你的结构是sizeof(waveFileHeader)大小的字节大小。

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

尝试:

fread(&waveFileHeader, sizeof(waveFileHeader), 1, filePtr); 
+0

我不知道如何到达那里,不应该是一个指针。但是这根本不能解决问题。 (指针来自一个较早的版本,我试图搞砸一点,但那的确是错误的方向) – Anderiel

0
从上面

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

你应该使用尺寸定义的类型,如uint8_tuint16_tuint32_t