2013-06-20 146 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