C ++二进制写入/读取32位到/从64位

时间:2013-12-23 00:16:17

标签: c++ file file-io stream 32bit-64bit

如果您有二进制输出流,并将整数写入32位Windows计算机上的文件。那么您是否能够在64位Windows计算机上从同一文件中读取相同的整数?

我的猜测是。由于32位计算机上的整数是4个字节,因此64位计算机上的整数是8个字节。

以下代码也是如此,而无论操作系统,计算机体系结构和数据类型如何,都必须能够从64位和32位计算机读取和写入文件。如果不是,那么如何才能做到这一点,而文件必须是二进制形式。

编写

std::ofstream ofs("example.bin", std::ios::binary);

int i = 128;
ofs.write((char*) (&i), sizeof(i));

ofs.close();

std::ifstream ifs("example.bin", std::ios::binary);

int i = 0;
ifs.read((char*) (&i), sizeof(i));

ifs.close();

2 个答案:

答案 0 :(得分:3)

虽然int几乎所有现代平台(32位和64位)上都是4个字节,但其大小无保证。因此,为了将数据序列化到文件或其他二进制流中,您应该更喜欢C ++ 11中引入的头<cstdint>中的固定宽度整数类型(某些编译器在C ++ 03中支持它):

#include <cstdint>

...
int32_t i = 128;
ofs.write((char*)(&i), sizeof(i));
...

另一种选择是强制某种类型具有特定的大小,例如int大小为4.如果不是这样,请确保您的程序无法编译,请使用static_assert

...
int i = 128;
static_assert(sizeof(i) == 4, "Field i has to have size 4.");
ofs.write((char*)(&i), sizeof(i));
...

虽然考虑到我们如上所述固定宽度整数,这听起来很愚蠢但如果你想存储一个你在某个库的特定版本中做出假设的整个结构,这可能会很有用。示例:来自vec4的{​​{1}}被记录为包含四个浮点数,因此在序列化此结构时,最好静态检查以便捕获将来的库更改(不太可能但可能)。

另一个非常重要的考虑因素是整数类型的结束,这些类型因平台而异。现代x86桌面平台的大多数编译器对整数类型使用小端,所以我更喜欢这个你的二进制文件格式;但如果平台使用大端,你需要转换它(反转字节顺序)。

答案 1 :(得分:1)

不能保证C ++中int的大小。你要知道的是,它至少与short int一样大,并且不大于long int。编译器可以在这些约束中自由选择合适的大小。虽然大多数人会选择32位作为int的大小,但有些人不会。

如果你知道你的类型总是32位,那么你可以使用int32_t类型。

include <stdint.h>

获得此类型。