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

问题描述 投票:0回答:1

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

感谢您的关注。

c++ filestream endianness
1个回答
0
投票

两个简单规则:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.