c++ - C++字节序会影响fstream的读写功能吗?
问题描述
我正在学习如何写入/读取二进制文件,并且我希望我的文件对于任何支持 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 处理字节序差异?如果没有,有没有办法防止字节序问题?
感谢您的关注。
解决方案
两个简单的规则:
如果您要将二进制数据写入文件,请记录文件格式。
将二进制数据写入文件时,请确保写入的字节符合文件格式的要求。
如果文件格式说有一个大端格式的 16 位整数,而您编写的代码可以读取或写入它,那么一切都会正常工作。
不要使用这样(char*)&i
的强制转换,因为这样字节将保存本机系统碰巧用于 16 位整数的任何格式,甚至不能保证(根据 C++ 标准)在运行相同代码时保持稳定相同的系统。
推荐阅读
- c# - 在http-context响应C#中分块下载文件
- mongodb - 从 getMongo 处理器中提取日期时的 $numberlong 格式
- javascript - setTimeout 如何在 JavaScript 中实现 promise?
- angularjs - AngularJS 延迟加载路由无法正常工作
- android - 验证 RecyclerView 中的重复条目
- php - 当我上传带有变体的更新产品的 excel 时,shopify Api 中出现错误(api 客户端每秒超过 2 次调用)
- git - 无法在 AWS CodeCommit 中合并拉取请求。抱怨有冲突,但是远程和本地都是最新的
- python-3.x - 启动本地烧瓶服务器以使用 pytest 进行测试
- symfony - 无法在 symfony 中自动装配服务
- scala - 如何将十进制逻辑类型读入火花数据帧