【问题标题】:Most efficient way to write a number in a file in C?用C在文件中写入数字的最有效方法?
【发布时间】:2014-01-18 17:18:28
【问题描述】:

我需要在文件中跟踪大于 255 的 int 数。它大于最大的无符号字符,因此使用 fputc 似乎不可靠(第一个问题:它总是正确的吗?)。

我可以使用fputs,通过将数字转换为字符,从而获得一个字符串;但在程序中,我也需要将数字作为整数!

所以,标题中的问题:写这个数字最有效的方法是什么?有没有办法避免转换为字符串? 保持文件应该被另一个进程读取,其中 char 编号应该再次变为 int。

【问题讨论】:

  • 使用 fwrite 将其写入二进制数据即可。
  • 有什么理由不写二进制 16 位 int 吗?
  • 你可以使用联合,虽然这有点过头了。
  • 实际上写入和读取文件将比 fprintf/fscanf 代码与字符串之间的转换慢两个数量级。您很可能会过早地进行优化。

标签: c string file-io char int


【解决方案1】:

只需写出二进制表示:

int fd;
...
int foo = 1234;
write (fd, &foo, sizeof(foo));

(并添加错误处理)。

或者如果你喜欢FILE*

FILE *file;
...
int foo = 1234;
fwrite (&foo, sizeof(foo), 1, file);

(并添加错误处理)。

请注意,如果您的文件要加载到不同的系统上,可能具有不同的字节序,您可能需要确保字节的字节序是恒定的(例如,最高有效字节或最低有效字节在前)。如果需要,您可以使用htnolhtons 等。如果您知道加载文件的架构与保存文件的架构相同,则无需这样做。

【讨论】:

  • 第二次写入应该是fwrite
  • 通过错误处理是指控制 write() 或其他返回的值?
  • 错误处理意味着您应该始终考虑如果写入文件失败会发生什么。这将在writefwrite 的返回值中。
  • 是的,架构是一样的,但功能还是有用的。
  • 另外,只关注字节序是不够的:在有符号整数类型的情况下,表示(2 的补码、1 的补码、符号+幅度)也很重要。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2011-06-06
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
相关资源
最近更新 更多