2015-07-22 67 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的第三个参数是号码由第二个参数指定的大小的元素。它不是以字节为单位的总大小,你现在正在做的。

所以你超出你的缓冲区。