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

How to write an unsigned long long integer value to a text file using fwrite()?

我需要将 unsigned long long 整数值写入文本文件。当我使用 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() 更快,因为它实际上并未将值转换为您可以使用文本编辑器查看的字符表示形式。它只是将整数的原始字节数据写入文件。

如果你想使用 fwrite(),你必须事先将整数值转换为字符串,尽管我认为你很难找到比简单地使用 fprintf() 更高的性能.

... need to write unsigned long long integer values to a text file ...

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

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

为了写入速度更快,考虑以binary模式写入text file文件。这将丢失行尾翻译,但可能会提高性能。

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

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

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