2016-07-14 117 views
0

我正在讀取一個二進制wav文件,將其放入一個緩衝區,並且我想再次寫入完全相同的wav文件。C - 將緩衝區寫入二進制文件(wav)

這是到目前爲止我的代碼:

file = fopen("tone1.wav", "rb"); 
file3 = fopen("outout.wav","wb"); 
fseek(file, 0, SEEK_END); 
fileLen=ftell(file); 
fseek(file, 0, SEEK_SET); 
buffer=(char *)malloc(fileLen+1); 
buffer3=(char *)malloc(fileLen+1); 
fread(buffer, fileLen, 1, file); 
for (int i=0;i<fileLen+1;++i){ 
    buffer3[i]=buffer[i]; 
    fwrite(buffer3,sizeof(buffer3),1,file3); 
} 
fclose(file); 
fclose(file3); 
free(buffer); 
free(buffer3); 

的問題是,outout wav文件來空,無法播放。 我不知道我在做什麼錯。如果我用fwrite(buffer3,sizeof(buffer3),1048,file3);替代fwrite(buffer3,sizeof(buffer3),1,file3);(比如說1048),我可以得到一些可播放的東西,但不是帶有循環的整個wav。

誰能告訴我有什麼問題嗎?也許這是for循環的長度是錯誤的,也許我不應該把fileLen作爲一個限制嗎?我應該用什麼來取代1?

在此先感謝

+2

'sizeof(buffer3)' - 沒有做你認爲的事情;這是*指針*的大小。無論如何,我不確定你想在循環中使用'fwrite'。 – WhozCraig

+0

你是對的我用sizeof(char)代替它,但仍然是相同的(因爲我的緩衝區指向字符) –

回答

0

不要寫在循環內部。
或每次寫不同的字符(並不總是buffer3[0])。

fread(buffer, fileLen, 1, file); 
for (int i = 0; i < fileLen; ++i) { 
    // transform and copy 
    buffer3[i] = transform(buffer[i]); 
    //fwrite(buffer3 + i, 1, 1, file3); // write 1 character only 
} 
fwrite(buffer3, fileLen, 1, file3); // write all the new buffer 
+0

我現在明白了。非常感謝你 –

0

我通過把fwrite(buffer3,sizeof(char),78000,file3);外面的for循環,以78000作爲文件1的大小,解決它。但我的問題是,我怎麼知道代碼的大小是多少?

+0

大小是'fileLen'。 – pmg

1

請注意以下事項:

  • 的事實,該文件是「原始」,並有一個「.WAV」擴展名,如你所說的那樣,既沒有意味着它是一個wav文件,也不讓一個wav檔案出來了。爲了成爲一個wav文件,它需要一個有效的WAV頭,並且需要適當的音頻文件API來讀取和寫入。你正在閱讀和複製的內容是無標頭未知格式和未知字節順序的數據。
  • 如果您希望使用標準庫C函數將內容從一個文件複製到另一個文件,您可以在字節級別執行此操作,而不需要解釋內容,這就是您的操作。

在這種情況下,有在你的代碼的幾個問題:

  1. 緩衝區的冗餘填充和鑄件的malloc在C回報:
    buffer = malloc(fileLen);應該工作。
  2. 模棱兩可的邏輯:爲什麼在一次讀取源文件後,在循環內複製緩衝區並寫入目標文件字節 - 每字節?
  3. 即使如此,您仍然將不正確的參數傳遞到freadfwrite函數,請檢查頁。
    fread(buffer, 1, fileLen, file);應該修復讀取。 (1等於sizeof (char))。
  4. 爲什麼你需要一個冗餘緩衝區buffer3如果你不解釋文件的內容?
  5. 即使如此,您仍然將不正確的參數傳遞給循環內的函數。這應該做的修補程序:

    for (int i=0; i<fileLen; i++){ 
        buffer3[i]=buffer[i]; 
        fwrite(&(buffer3[i]),1,1,file3); 
    } 
    

一般人不知道該文件的事先大小,打開源文件之前。因此,分配合理大小的緩衝區,然後以由緩衝區大小確定的區塊讀取和寫入。在這種情況下,你的讀程序也應該處理緩衝區下溢情況。