将双值保存到文件的可移植方法是什么?

时间:2013-08-22 07:27:16

标签: c++ c++11 save binaryfiles

我想使用mmap将数据存储到二进制文件中。为了确保我的解决方案是可移植的,我想使用指定宽度(uint32_t和朋友)的类型来保存我的数据。

但是,我还必须保存一些double值。通过查看<cstdint>标题,似乎没有定义浮点类型。此外double似乎没有固定的宽度和表示。

如何以便携方式保存(并加载)二进制文件中的浮点值?我是否需要将它们转换为整数类型以保存它们?

2 个答案:

答案 0 :(得分:3)

这取决于你想要(或需要)实现的目标。

简而言之,您有两个解决方案:

  • 以十进制形式存储,这意味着转换,但可以读取但是想要
  • 以二进制形式存储,这意味着已知的位宽和字节顺序

还有一个混合解决方案:每个数字的文本二进制表示0xd775u7f1...。主要的优点是你没有字节顺序问题,但另一方面你仍然遇到位宽问题(尽管可以从表示中推断出来)。

我建议你简单地创建一个格式并记录它。一种简单的格式是:

  • 二进制
  • 64位
  • 小端

(这是在x86上运行的64位程序)

这是可移植的,因为指定了它,但在某些平台上可能更快。

答案 1 :(得分:3)

我正在扩展Matthieu M.在his answer中提到的“混合解决方案”。

我会使用ISO C99标准中的%a%la格式说明符将数字转换为十六进制字符串并返回。 据我所知,遗憾的是我们在C ++ 11中没有类似的功能。

#include <stdio.h>

int main() {

  double x = 0.1;

  char* str = "0X1.999999999999AP-4";

  printf("0.1 in hexadecimal is: %A\n", x);

  printf("Now reading %s\n", str);

  /* in a production code I would check for errors */
  sscanf(str, "%lA", &x); /* note: %lA is used! */

  printf("It equals %g\n", x);

}

标准,便携,没有字节顺序的麻烦,没有精度损失,但需要更多的存储空间。


UPDATE:虽然编译器支持仍在追赶,但有一个C ++ 11解决方案,请参阅std::hexfloat