Val*_*tin 5 c++ file-io file 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();
Run Code Online (Sandbox Code Playgroud)
std::ifstream ifs("example.bin", std::ios::binary);
int i = 0;
ifs.read((char*) (&i), sizeof(i));
ifs.close();
Run Code Online (Sandbox Code Playgroud)
虽然int在几乎所有现代平台(32 位和 64 位)上都是 4 个字节,但不能保证其大小。因此,要将数据序列化为文件或其他二进制流,您应该更喜欢<cstdint>C++11 中引入的标头中的固定宽度整数类型(一些编译器在 C++03 中支持它):
#include <cstdint>
...
int32_t i = 128;
ofs.write((char*)(&i), sizeof(i));
...
Run Code Online (Sandbox Code Playgroud)
另一种选择是强制特定类型具有特定大小,例如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));
...
Run Code Online (Sandbox Code Playgroud)
虽然考虑到我们上面有固定宽度的整数,这听起来很愚蠢,但如果您想存储在某个库的某个版本中做出假设的整个结构,这可能很有用。示例:vec4fromglm被记录为包含四个浮点数,因此在序列化此结构时,最好静态检查它以捕获未来的库更改(不太可能但可能)。
然而,另一个需要考虑的非常重要的事情是整数类型的字节序,它因平台而异。大多数现代 x86 桌面平台的编译器对整数类型使用 little endian,所以我更喜欢你的二进制文件格式;但是如果平台使用大端,你需要转换它(反转字节顺序)。
| 归档时间: |
|
| 查看次数: |
4621 次 |
| 最近记录: |