gpt4 book ai didi

c - 写入二进制文件时的开销数据

转载 作者:太空狗 更新时间:2023-10-29 16:28:36 24 4
gpt4 key购买 nike

我想将包含 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 85fd 0804 0001 而我希望得到只有 0000 0000 0000

附加数据代表什么 85fd 0804 0001 以及如何防止它发生?

最佳答案

What does the additional data represent 85fd 0804 0001

可能是一些随机垃圾数据。

how do I prevent it from occurring?

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); 时,6 个 2 字节的对象被写入文件,这不是你想要做的。

现在您正在从 buff[0] 开始写入 6 个类型(大小)int16_t 的数据,即 buff[0..5]到输出。 buff[0..2] 是预期的 0buff[3..5] 是垃圾。

关于c - 写入二进制文件时的开销数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31556528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com