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

Linux下C++将二进制数写入文件时出现异常结果

问题根源分析

你现在的问题出在错误地把ASCII形式的二进制字符串当成了二进制数据写入。bitset<32>(number).to_string()生成的是由字符'0'和'1'组成的字符串,每个字符占1个字节(比如'0'对应ASCII码0x30,'1'对应0x31)。当你把这个字符串写入文件时,实际上写入了32个ASCII字节,而不是你期望的4字节原始二进制整数。

举个例子:输入8时,生成的字符串是"00000000000000000000000000001000",写入文件后这32个字符会占用32字节,而不是4字节的0x08 0x00 0x00 0x00(小端模式)或者0x00 0x00 0x00 0x08(大端模式)。

修正后的代码

直接将整数的原始二进制数据写入文件即可,不需要转成字符串:

#include <fstream>
#include <cstdio> // 用于remove函数
#include <iostream>

void writeToBinaryFile(int number){
    // 移除旧文件:如果文件不存在,remove会返回非0值,但不影响后续操作
    remove("path/fileToWriteTo.img");
    // 以二进制模式打开文件
    std::ofstream output("path/fileToWriteTo.img", std::ios::binary);
    
    if (output.is_open()) {
        // 直接写入int的原始二进制数据,sizeof(int)确保写入4字节(通常平台下)
        output.write(reinterpret_cast<const char*>(&number), sizeof(int));
        output.close();
    } else {
        // 添加错误处理,避免静默失败
        std::cerr << "Error: Failed to open the file for writing!" << std::endl;
    }
}
额外补充说明
  • 如果需要跨平台统一字节序(比如强制大端模式),可以手动转换整数的字节顺序后再写入,避免不同CPU架构的字节序差异:
    #include <arpa/inet.h> // Linux下用于htonl函数
    // ...
    int bigEndianNum = htonl(number); // 将主机字节序转换为网络字节序(大端)
    output.write(reinterpret_cast<const char*>(&bigEndianNum), sizeof(int));
    
  • 永远记得检查文件是否成功打开,路径错误、权限不足等问题都可能导致写入失败,提前处理能帮你快速定位问题。

内容的提问来源于stack exchange,提问作者MMMMMCK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:54:54