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

C++二进制写入文件失败:为何无法将数字以二进制格式写入文件?

排查C++二进制文件写入失效的问题

我来帮你梳理下这段代码里导致写入/读取异常的核心问题:

1. 输出流未刷新/关闭,数据仍在缓冲区

你写完文件后立刻就打开输入流读取,但ofstream默认使用缓冲区机制——调用write后,数据可能还留在内存的缓冲区里,并没有真正写入到磁盘文件中。这时候用ifstream去读,自然拿不到刚写入的数据。

解决这个问题的方法有两种:

  • 显式关闭输出流:调用data_to_save.close(),关闭时会自动刷新缓冲区并写入磁盘
  • 手动刷新缓冲区:调用data_to_save.flush(),直接把缓冲区的数据写入磁盘,不需要关闭流

2. 代码存在语法错误(次要但必须修复)

你代码末尾的cout << ...是不完整的,这会导致编译失败,需要补全输出逻辑,比如cout << "读取到的数字:" << numbers_16 << endl;

修正后的完整代码

#include <iostream>
#include <fstream>
#include <stdint.h>
using namespace std;

int main(){
    uint16_t number = 2;
    ofstream data_to_save("saved_data.bin", ios_base::binary);
    
    // 检查文件是否成功打开
    if (!data_to_save) {
        cerr << "无法打开输出文件!" << endl;
        return 1;
    }
    
    data_to_save.write(reinterpret_cast<char*>(&number), sizeof(number));
    data_to_save.close(); // 关闭输出流,确保数据写入磁盘
    
    uint16_t numbers_16;
    ifstream data("saved_data.bin", ios_base::binary);
    
    // 检查文件是否成功打开
    if (!data) {
        cerr << "无法打开输入文件!" << endl;
        return 1;
    }
    
    data.seekg(0);
    data.read(reinterpret_cast<char*>(&numbers_16), sizeof(numbers_16));
    
    // 检查读取是否成功
    if (data.good()) {
        cout << "读取到的数字:" << numbers_16 << endl;
    } else {
        cerr << "读取文件失败!" << endl;
    }
    
    return 0;
}

额外建议

  • 每次操作文件后,都应该检查流的状态(比如good()、fail()),这样能快速定位到文件打开失败、读写失败等问题
  • 如果是跨平台场景,还要注意字节序的问题(大端/小端),不过这个是后续扩展需要考虑的,当前问题里不影响

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:20:38