如何将 double 转换为 char[] 并返回以读取/写入二进制文件?
How to convert a double to a char[] and back for reading / writing to binary file?
我正在尝试将 double 写入二进制文件,但无法弄清楚如何以可移植的方式将其转换为 char[]。我想以 IEEE double precision format、big endian 格式编写,然后将其转换回当前平台的格式。
感谢您的帮助。
C 和 C++ 具有 fread 和 fwrite,它们只是将指定块大小的指定位置的字节复制到指定的文件流,反之亦然...您不必转换为 char[ ]
各种方法:
1) 使用字符串。如果 FLT_RADIX
为 10,则使用 fprintf(outf, " %.*e", DBL_DECIMAL_DIG-1, x)
,否则使用 fprintf(outf, " %a", x)
(Ref)。使用 fscanf(inf, "%lf", &x)
回读。 ("%la"
效果相同)
2) 使用联合并假定 double
格式为 IEEE double precision binary format, maybe also use defined endian 和 *nix: htonl()
union d2a {
double d;
unsigned char uc[sizeof double];
} u;
u.d = x;
ToNetworkEndian(u.uc);
fwrite(u.uc, 1, sizeof u.uc, outf);
fread(u.uc, 1, sizeof u.uc, inf);
FromNetworkEndian(u.uc);
x = u.d;
3) 编写大量代码将编译器的非标准 double
转换为 IEEE
考虑到:不同的精度、范围、wobbling precision, +/- 0, sub-normals 等
推荐选项1
我正在尝试将 double 写入二进制文件,但无法弄清楚如何以可移植的方式将其转换为 char[]。我想以 IEEE double precision format、big endian 格式编写,然后将其转换回当前平台的格式。
感谢您的帮助。
C 和 C++ 具有 fread 和 fwrite,它们只是将指定块大小的指定位置的字节复制到指定的文件流,反之亦然...您不必转换为 char[ ]
各种方法:
1) 使用字符串。如果 FLT_RADIX
为 10,则使用 fprintf(outf, " %.*e", DBL_DECIMAL_DIG-1, x)
,否则使用 fprintf(outf, " %a", x)
(Ref)。使用 fscanf(inf, "%lf", &x)
回读。 ("%la"
效果相同)
2) 使用联合并假定 double
格式为 IEEE double precision binary format, maybe also use defined endian 和 *nix: htonl()
union d2a {
double d;
unsigned char uc[sizeof double];
} u;
u.d = x;
ToNetworkEndian(u.uc);
fwrite(u.uc, 1, sizeof u.uc, outf);
fread(u.uc, 1, sizeof u.uc, inf);
FromNetworkEndian(u.uc);
x = u.d;
3) 编写大量代码将编译器的非标准 double
转换为 IEEE
考虑到:不同的精度、范围、wobbling precision, +/- 0, sub-normals 等
推荐选项1