【问题标题】:printf prints to a binary file in cprintf 打印到 c 中的二进制文件
【发布时间】:2012-10-09 09:07:25
【问题描述】:

我有一个可以打开、修改和关闭的二进制文件。然后我 printf 到控制台。

这一切都很好,但我刚刚意识到它会将我打印到控制台的任何内容附加到二进制文件的末尾,无论文件是打开还是关闭都没有区别。

fprintf 也会发生同样的事情。

这里发生了什么?文件 I/O 有什么我不明白的地方吗?

更新:代码如下:

FILE *out = fopen("test","wb+");
fseek(out,0,SEEK_END);
fwrite("test",1,10,out);
fwrite("test",1,10,out);
fwrite("test",1,10,out);
int pos = ftell(out);
fwrite(&pos,sizeof(int),1,out);
fclose(out);
fprintf(stdout,"%s","hello");

【问题讨论】:

  • 你能贴出演示这个的代码吗?
  • 是的,如果没有代码,我们真的无法为您提供帮助。如果您向我们展示您是如何运行程序的,也会很有帮助。

标签: c file-io printf


【解决方案1】:

fwrite() 的调用不正确,因为它们指示fwrite() 从5 个字符数组中写入10 字符(字符串文字附加了一个隐式空字符)。这将超出数组的末端进行访问,从而导致未定义的行为,并且可能是导致奇怪行为的原因。

更正fwrite() 调用:

fwrite("test", 1, 4, out);

根据评论,如果必须有 10 个字符,则声明一个数组:

char msg[10] = "test"; /* Unspecified elements will be null. */

fwrite(msg, 1, sizeof(msg), out);

【讨论】:

  • 有什么办法可以保留这10个字符吗?就像将最后 6 个字符设为 NULL 一样?
  • fwrite("test",1,10,out); 更改为fwrite("test\0\0\0\0\0\0",1,10,out);
  • malloc 也是这样吗?还是我必须 memset 将元素设为 null?
  • @Matt,malloc() 并非如此。您必须使用memset() 或单独进行初始化。请注意,sizeof() 不会返回 malloc()d 数组中的元素数。
  • @hmjd 这就是问题所在。谢谢。
猜你喜欢
  • 2011-01-08
  • 2011-11-22
  • 2023-03-03
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2021-05-25
  • 2023-04-07
相关资源
最近更新 更多