std:ostream和跨平台兼容性

时间:2011-12-07 05:18:16

标签: c++ stream

我有一个简单的文件保存/加载功能,但因为它是一个插件,由于主机API,所有内容都以二进制格式写入std :: ostream,并从std :: istream再次回读。

我用

out.write((char *)&value,sizeof(type));
in.read((char *)&value,sizeof(type));

用于读写,其中type为“unsigned int”,“double”等。

我正在考虑这可能带来的后果,当文件保存在一个平台上然后加载到另一个平台上时会发生什么(由于主机限制,这将是一个32/64位的窗口,64位的linux和64位的mac,只有x86 CPU)的。如果我不使用变量大小类型,如size_t(在32位和64位系统上不同),我可以确定“unsigned int”或“double”将保持相同的长度吗?有没有最好的做法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

如果我不使用变量大小类型,如size_t(在32位和64位系统上不同),我可以确定“unsigned int”或“double”将保持相同的长度吗?

没有。即使unsigned intdouble的大小也可能因平台而异。


  

有没有最好的做法来解决这个问题?

是。序列化数据。

例如,您可以按照以下步骤操作:

  • 首先写一个变量的大小,作为一个单字节!
  • 然后取变量,将其分成N个字节,其中N = sizeof(value),然后逐个写入每个字节 - 从低有效字节到高有效字节,反之亦然。
  • 在另一台机器上,首先读取大小,然后逐个读取字节,合并它们以获取值。合并意味着与第2步中提到的过程相反。

如果您正在编写大量值,那么您可能希望改进上述步骤:首先,您不希望为每个值编写大小,因为它只是一个重复,而是您可以编写一个标题包含所有这些将重复使用的信息。

答案 1 :(得分:0)

您说这将运行的所有系统都将具有与uint32_t相同的大小类型。 doublefloat也是一样的 最佳实践仍然是纳瓦兹的答案。