使用std::fstream的binary模式写入却为ASCII格式?是否符合预期?
问题解答
这是预期行为
std::ios::binary标志仅用于禁用文本模式下的换行符自动转换(比如Windows系统中把\n转为\r\n),但它不会改变<</>>操作符的格式化本质。这两个操作符属于格式化输入输出工具,会把数值转换成对应的ASCII字符序列写入文件,所以你看到文件内容是ASCII格式的"12"、读取后得到整数12,都是正常的预期行为。
正确的二进制读写方式
要实现真正的二进制数据读写,需要使用文件流的write()和read()成员函数,直接操作变量在内存中的原始二进制字节:
#include <fstream> #include <iostream> #include <cstdint> int main() { uint64_t a = 1; uint64_t b = 2; uint64_t c; // 二进制写入 std::ofstream s("file.bin", std::ios::out | std::ios::binary); s.write(reinterpret_cast<const char*>(&a), sizeof(a)); s.write(reinterpret_cast<const char*>(&b), sizeof(b)); s.close(); // 二进制读取第一个uint64_t std::ifstream in("file.bin", std::ios::in | std::ios::binary); in.read(reinterpret_cast<char*>(&c), sizeof(c)); in.close(); std::cout << c << '\n'; // 输出1 std::cin >> c; return 0; }
代码说明
reinterpret_cast<const char*>:将uint64_t变量的内存地址转换为字符指针,适配write()/read()以字节为单位操作数据的要求。sizeof(a):指定读写的字节数,确保完整覆盖整个uint64_t类型的内存空间(8字节)。
额外提示
如果需要跨平台处理二进制文件,要注意**字节序(大小端)**差异——不同CPU架构下,多字节整数的内存存储顺序可能不同。仅在同一平台读写时无需关注;若跨平台,需手动统一字节序(比如转换为网络字节序)。
内容的提问来源于stack exchange,提问作者Ahmed AEK
相关产品推荐
相关产品推荐

