我有一个简单的文件保存/加载功能,但因为它是一个插件,由于主机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”将保持相同的长度吗?有没有最好的做法来解决这个问题?
答案 0 :(得分:1)
如果我不使用变量大小类型,如size_t(在32位和64位系统上不同),我可以确定“unsigned int”或“double”将保持相同的长度吗?
没有。即使unsigned int
和double
的大小也可能因平台而异。
有没有最好的做法来解决这个问题?
是。序列化数据。
例如,您可以按照以下步骤操作:
N
个字节,其中N = sizeof(value)
,然后逐个写入每个字节 - 从低有效字节到高有效字节,反之亦然。 如果您正在编写大量值,那么您可能希望改进上述步骤:首先,您不希望为每个值编写大小,因为它只是一个重复,而是您可以编写一个标题包含所有这些将重复使用的信息。
答案 1 :(得分:0)
您说这将运行的所有系统都将具有与uint32_t
相同的大小类型。 double
和float
也是一样的
最佳实践仍然是纳瓦兹的答案。