目前,在32位机器上,我将二进制数据写入文件,如下所示:
outbin.write( reinterpret_cast <const char *> ( &key_session ), sizeof( unsigned int ) );
outbin.write( reinterpret_cast <const char *> ( &last_access_time ), sizeof( time_t ) );
outbin.write( reinterpret_cast <const char *> ( &sizet ), sizeof( size_t ) );
outbin.write( reinterpret_cast <const char *> ( &ddd), sizeof( double ) );
outbin.write( reinterpret_cast <const char *> ( &fff), sizeof( float ) );
如何编写数据以使其可移植并确保数据将在任何计算机(64位)上加载? (也许当操作系统在机器上更改为64位或数据将被复制到其他机器时)
答案 0 :(得分:4)
在C ++ 0x中,使用std::uint32_t
中的<cstdint>
类型。在较旧的编译器中,使用C99标头<stdint.h>
;这在MSVC中是缺失的,但它的各种实现都在Web上浮动。在撰写时,您必须将所有int
和size_t
变量投射到<cstdint>
类型,并在阅读时将其转换回原生类型。
float
和double
没有可移植的已知宽度版本,因此您可能必须假设它们与IEEE 754中的单格式和双格式匹配。某些断言可能对此有所帮助。
至于time_t
,请注意它在各个平台上没有标准化含义,只是它可以用一些未指明的方式表示时间。
(另外,请记住,您可能希望以endian-neutral格式写出数据。)