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

C++ Is endianness affecting fstream's read and write functions?

我正在学习如何从二进制文件编写 to/read,我希望我的文件对于任何支持 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 处理字节序差异?如果没有,是否有办法防止字节序问题?

感谢您的关注。

两条简单的规则:

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

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

如果文件格式表明有一个大端格式的 16 位整数,并且您编写读取或写入它的代码,一切都会正常工作。

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