C ++的字节序是否会影响fstream的读写功能?

时间:2020-04-17 16:43:59

标签: c++ filestream endianness

我正在学习如何对二进制文件进行写入/读取操作,并且我希望我的文件对于支持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差异?如果没有,是否有办法防止字节序问题?

感谢您的关注。

1 个答案:

答案 0 :(得分:4)

两个简单的规则:

  1. 如果要将二进制数据写入文件,请记录文件格式。

  2. 将二进制数据写入文件时,请确保要写入的字节符合文件格式的要求。

如果文件格式说有一个16位整数(big-endian格式),而您编写的代码可以读取或写入,则一切正常。

不要使用像(char*)&i这样的类型转换,因为这样字节将保持本机系统碰巧用于16位整数的任何格式,甚至不能保证(由C ++标准)稳定跨同一系统上相同代码的运行。

相关问题