【问题标题】:How to write an unsigned long long integer value to a text file using fwrite()?如何使用 fwrite() 将无符号长整数值写入文本文件?
【发布时间】:2015-10-25 19:12:37
【问题描述】:

我需要将无符号长整数值写入文本文件。当我使用 fprintf() 时,它工作得很好,但是需要时间。我已经分析了我的应用程序并且 fprintf() 占用了所有时间的一半。我做了一项研究,发现 fwrite() 比 fprintf() 更有效。但是我不知道怎么用?

我的 fprintf() 代码

fprintf(out, "%llu %llu\n", min, minv);

我的 fwrite() 代码

fwrite(&min,sizeof(unsigned long long int),1, out);
fputs(" ",out);
fwrite(&minv,sizeof(unsigned long long int),1, out);
fputs("\n", out);

fwrite() 第一个更快,但是当我打开文件时,数据就像

¾²ö㄀㄀㄀ `àÔàUü
ؾ{4-㄀㄀㄀ "¤#sÏ$P
 oD/㄀㄀㄀ 
-5X®Z

在这种情况下如何正确执行 fwrite()?

【问题讨论】:

  • fwrite 被称为“正确”。你误解了fprintffwrite 做不同的事情。 fprintf 打印字符表示,fwrite 打印原始数据。选一个。 (而且我认为您不应该在这里关心输出性能。破坏代码的速度优化毫无价值。)
  • 尝试用十六进制编辑器打开它。
  • 如果您要坚持使用fwrite(),您首先必须将unsigned long long 值转换为字符串——也许使用snprintf()? — 然后使用fwrite() 将适当长度的字符串写入文件。当然,使用fprintf() 进行格式化和写入要容易得多,但如果你想打败它,那就是你需要做的。如果使用snprintf() 不行(它与fprintf() 有很多相同的代码),那么你必须编写自己的转换函数;没有将unsigned long long 转换为字符串的标准函数。
  • 发布 out 的打开方式 - 对于正确使用 fwrite() 至关重要。
  • @chux out = fopen("D:\\output/data.out","w");就这样打开了

标签: c optimization file-io fwrite


【解决方案1】:

...需要将无符号长整数值写入文本文件...

编写unsigned long long 的典型方法如下。请注意,文件是以文本模式打开的。

out = fopen("data.out","w");
fprintf(out, " %llu", x);

要写得更快,可以考虑以 binary 模式写 text 文件文件。这会丢失行尾翻译,但可能会提高性能。

out = fopen("data.out","wb");
fprintf(out, " %llu", x);

如果编译器很弱,将unsigned long long 转换为字符串可能会进一步改进。需要一个非标准的转换函数。一些想法here

out = fopen("data.out","wb");
char buf[50];
buf[0] = ' ';

size_t size = my_ulltoa(&buf[1], x);  // returns size of the array used.
fwrite(buf, 1, 1 + size, 1, out);

OP 对以下内容的使用失败,因为它向 text 文件写入了二进制(例如 4 或 8 字节)表示,该文件不能作为字符读取。

out = fopen("data.out","w");
// fails
fwrite(&min,sizeof(unsigned long long int),1, out);

将二进制表示写入 binary 文件要快得多 - 但它不能作为文本读取。

// Works for non-text files
out = fopen("data.out","wb");
fwrite(&min, sizeof min, 1, out);

【讨论】:

    【解决方案2】:

    fwrite() 更快,因为它实际上并没有将值转换为您可以使用文本编辑器查看的字符表示。它只是将整数的原始字节数据写入文件。

    如果您想使用fwrite(),则必须事先将整数值转换为字符串,尽管我认为您很难找到与简单使用fprintf() 相比的性能提升。

    【讨论】:

    • 好吧,我使用 fprintf() 来写一行,我有数百万行。如果我找到了可以提高性能的东西,那就太棒了。在这种情况下,你有什么建议?对于它来说,更可接受的理论是什么?
    • @AlwaysNewbie 如果你想击败fprintf() 的性能,你必须编写自己的函数来将unsigned long long int 转换为字符串,以便可以将其写入带有@ 的文件987654326@.
    猜你喜欢
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多