开销数据写入到一个二进制文件
我想要写一个阵列含有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
以及如何防止其发生?
什么额外的数据代表
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]
是垃圾。
对元素大小参数使用'sizeof(buff [0])'也不是更好吗? –
@ColonelThirtyTwo是的,这是可取的。 –
fwrite
的第三个参数是号码由第二个参数指定的大小的元素。它不是以字节为单位的总大小,你现在正在做的。
所以你超出你的缓冲区。
(几乎)最小和完整的例子,观察到的输出,预期的输出。你,先生,应该得到一枚奖章。 :-D – DevSolar
良好的旧缓冲区溢出:) – Luaan