如何使用fwrite()将无符号长整数值写入文本文件?

时间:2015-10-25 19:12:38

标签: c optimization file-io fwrite

我需要将无符号长整数值写入文本文件。当我使用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()?

2 个答案:

答案 0 :(得分:2)

  

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

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

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

要更快地编写,请考虑在二进制模式下编写文本文件。这将失去行尾翻译,但可能会提高性能。

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);

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

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

答案 1 :(得分:1)

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

如果你想使用fwrite(),你必须事先将整数值转换为字符串,尽管我认为你很难找到比仅使用fprintf()而获得的性能提升