我正在学习如何读写二进制文件,并且我希望我的文件对于支持C ++ 17的任何机器都是可读的。所以我有一个令人恐惧的想法:如果read()和write()受以下因素的影响,该怎么办?机器的字节序?
例如:我在大型字节序计算机上运行此代码,
#include <iostream>
#include <fstream>
#include <cstdint>
int main() {
std::ofstream Output("Hey.txt", std::ofstream::out | std::ofstream::binary);
if (Output.is_open()) {
int16_t i = 42;
Output.write((const char*)&i, 2);
}
}
然后,我将Hey.txt传递到小型字节序计算机上,然后在计算机上运行此代码,
#include <iostream>
#include <fstream>
#include <cstdint>
int main() {
std::ifstream Input("Hey.txt", std::ifstream::in | std::ifstream::binary);
if (Input.is_open()) {
int16_t i;
Input.read((char*)&i, 2);
std::cout << i << std::endl;
}
}
程序会打印42吗?还是fstream处理endian差异?如果没有,是否有办法防止字节顺序问题?
感谢您的关注。
两个简单规则:
如果要将二进制数据写入文件,请记录文件格式。
将二进制数据写入文件时,请确保要写入的字节符合文件格式的要求。
如果文件格式说有一个大尾数格式的16位整数,而您编写的代码可以读取或写入,则一切正常。
不要使用像(char*)&i
这样的强制类型转换,因为这样字节将保存本机系统碰巧用于16位整数的任何格式,并且甚至不能保证(根据C ++标准)在运行过程中是稳定的在同一系统上使用相同的代码。