2015-07-22 68 views
19

我想要寫一個陣列含有16位整數作爲原始二進制到一個文件,並用下面的例子中已經嘗試時:開銷數據寫入到一個二進制文件

# define __int8_t_defined 
__intN_t (8, __QI__); 
__intN_t (16, __HI__); 
__intN_t (32, __SI__); 
__intN_t (64, __DI__); 

int main(int argc, char *argv[]) 
{ 
    FILE * rawf; 
    rawf = fopen("./rawPcm","wb"); 
    int16_t buff[] = {0,0,0}; 
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); 
    fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); 
    fclose(rawf); 
} 

然而,輸出不只包含零更。

$ hexdump -v rawPcm 
0000000 0000 0000 0000 85fd 0804 0001 0000 0000 
0000010 0000 85fd 0804 0001      
0000018 

它爲每一個fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);而我希望得到的只有0000 0000 0000寫道:0000 0000 0000 85fd 0804 0001

附加數據代表什麼85fd 0804 0001以及如何防止其發生?

+8

(幾乎)最小和完整的例子,觀察到的輸出,預期的輸出。你,先生,應該得到一枚獎章。 :-D – DevSolar

+1

良好的舊緩衝區溢出:) – Luaan

回答

19

什麼額外的數據代表85fd 0804 0001

可能是一些隨機的垃圾數據。

我該如何防止它發生?

fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);應寫爲:

fwrite(buff,sizeof(int16_t), sizeof(buff)/sizeof(buff[0]),rawf); 
/*    ^      ^^^^^^^^^^^^^^^  */ 
/*  size of each object  Count of objects    */ 
/*    (2)     (3)       */ 

/* or */ 
fwrite(buff, sizeof buf[0], sizeof buff/sizeof buff[0], rawf); 

sizeof buff/sizeof buff[0]得到array length in number of objects (or members)sizeof buff給出陣列的以字節爲單位的大小。

因此,您正在讀取buff並將其寫入文件並調用undefined behaviour。在你的情況下,你正在看到隨機垃圾數據被寫入輸出文件。

在你的情況下,buff中每個元素的sizeof是2個字節,buff數組有3個成員,總大小爲6個字節。當你編寫fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);時,每個2字節的6個對象被寫入文件中,這不是你想要做的事情。

現在您正在編寫從buff[0](即buff[0..5])開始的6個數據類型(大小)int16_t到輸出。 buff[0..2]0 s按預期和buff[3..5]是垃圾。

+0

對元素大小參數使用'sizeof(buff [0])'也不是更好嗎? –

+0

@ColonelThirtyTwo是的,這是可取的。 –

9

fwrite的第三個參數是號碼由第二個參數指定的大小的元素。它不是以字節爲單位的總大小,你現在正在做的。

所以你超出你的緩衝區。