我正在学习如何对二进制文件进行写入/读取操作,并且我希望我的文件对于支持C ++ 17的任何计算机都是可读的。所以我有一个令人恐惧的想法:如果read()和write()受到影响该怎么办?通过机器的字节顺序?
例如: 我在大型字节序计算机上运行此代码,
function findThird1() {
let n1 = parseInt(document.querySelectorAll('.findThirdInput')[0].value);
let n2 = parseInt(document.querySelectorAll('.findThirdInput')[1].value);
let n3 = parseInt(document.querySelectorAll('.findThirdInput')[2].value);
document.getElementById('findThirdResult').innerHTML = findThird2([n1, n2, n3]);
}
function findThird2(arr) {
let flag = false;
for (var i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i + 1]) {
flag = true;
break;
}
}
return flag ? 'Equals' : 'not equals'
}
然后,我将Hey.txt传递到小型字节序计算机上,然后在计算机上运行此代码,
#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);
}
}
程序会打印42吗?还是fstream处理endian差异?如果没有,是否有办法防止字节序问题?
感谢您的关注。
答案 0 :(得分:4)
两个简单的规则:
如果要将二进制数据写入文件,请记录文件格式。
将二进制数据写入文件时,请确保要写入的字节符合文件格式的要求。
如果文件格式说有一个16位整数(big-endian格式),而您编写的代码可以读取或写入,则一切正常。
不要使用像(char*)&i
这样的类型转换,因为这样字节将保持本机系统碰巧用于16位整数的任何格式,甚至不能保证(由C ++标准)稳定跨同一系统上相同代码的运行。