You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:35:16