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

C++如何读取ofstream::binary模式保存的二进制文件并输出内容

问题排查及修复方案

一、核心问题总述

你的代码从保存到读取逻辑全链路存在不匹配和语法错误,才导致没有输出甚至程序隐性崩溃,具体错误点如下:

二、分模块错误说明

1. 二进制保存函数错误

  • 你并未将txt中的文本数字转为int类型的二进制存储,只是将文本字符串的ASCII值直接写入二进制文件,和后续读取逻辑中按int读取的规则完全不匹配
  • out.write((char*)temp, sizeof(temp))强制每次写255字节,不管每行实际读取的字符长度,写入内容包含大量无意义的空值/垃圾值,增加读取难度

2. 二进制读取函数错误

  • 参数传递错误:int *arr和int n都是值传递,函数内new的数组、计算的长度n都无法传回函数外部,外部调用时拿不到有效数据
  • 元素个数计算错误:n = size/sizeof(arr)中的arr是指针,32位系统下sizeof值为4、64位下为8,不是int类型的大小,正确应该除以sizeof(int)
  • 读取参数非法:in.read((char*)number, sizeof(n))直接将int变量number的值转为内存地址访问,属于非法内存访问,会导致程序崩溃/读取失败,正确需要取number的地址&number,且读取长度应为sizeof(int)

三、修正后代码

保存函数(将txt文本数字转为int二进制存储)

void saveinbinary()
{
    ifstream in("csdl.txt", ifstream::in);
    ofstream out("csdl.bin", ofstream::binary);
    int num;
    // 自动读取txt中的数字,跳过换行、空格等分隔符
    while(in >> num) {
        out.write((char*)&num, sizeof(int));
    }
    in.close();
    out.close();
}

读取函数(按int二进制读取并输出)

// arr用二级指针、n用引用才能把值带出函数
void readbinary(int **arr, int &n)
{
    ifstream in("csdl.bin", ifstream::binary);
    // 先判断文件是否打开成功,避免文件不存在、权限不足等问题
    if(!in.is_open()) {
        std::cout << "二进制文件打开失败" << std::endl;
        return;
    }
    in.seekg(0, in.end); 
    long size = in.tellg();
    in.seekg(0);
    // 按int大小计算元素个数
    n = size / sizeof(int);
    *arr = new int[n];
    for (int i = 0; i < n; ++i)
    {
        int number;
        // 传入number的地址,读取对应长度的二进制内容
        in.read((char*)&number, sizeof(int));
        (*arr)[i] = number;
    }
    // 输出所有数字
    for (int i = 0; i < n; ++i)
    {
        std::cout << (*arr)[i] << "\t";
    }
    in.close();
}

调用示例

int main() {
    saveinbinary();
    int *arr = nullptr;
    int n = 0;
    readbinary(&arr, n);
    // 用完释放堆内存避免泄漏
    delete[] arr;
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 22:09:00