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

C++读取二进制文件打印内容异常,求问题原因及代码排查

二进制文件读写异常问题排查

你的代码存在两处关键问题,同时还有潜在风险,导致读取后输出全为0:

核心问题分析

  1. 文件打开模式不明确
    使用fstream打开文件读取时,仅指定ios::binary是不够的。fstream默认打开模式为ios::in | ios::out,这种模式可能因系统或编译器差异导致文件指针位置异常,或打开逻辑不符合预期,最终引发读取失败。

  2. 未检查文件是否成功打开
    读写文件前均未验证文件是否打开成功。如果因权限不足、路径错误(比如程序运行目录与预期不符)等原因导致文件打开失败,后续读写操作会直接无效,buffer将保持初始化的0值。

修正后的代码

#include<iostream>
#include<fstream>
#include<string>
using namespace std;

const int MAX = 80;
int main(){
    int buffer[MAX];
    for (int i = 0 ; i < MAX ; i++){
        buffer[i] = i;
    }

    ofstream winfile;
    winfile.open("text.dat", ios::binary);
    // 检查写入文件是否成功打开
    if (!winfile.is_open()) {
        cerr << "无法打开写入文件!" << endl;
        return 1;
    }
    winfile.write(reinterpret_cast<char*>(buffer), MAX * sizeof(int));
    winfile.close();

    fstream rinfile;
    // 明确指定读取模式 + 二进制模式
    rinfile.open("text.dat", ios::in | ios::binary);
    // 检查读取文件是否成功打开
    if (!rinfile.is_open()) {
        cerr << "无法打开读取文件!" << endl;
        return 1;
    }
    for (int i = 0 ; i < MAX ; i++){
        buffer[i] = 0; 
    }

    rinfile.read(reinterpret_cast<char*>(buffer), MAX * sizeof(int));
    // 验证读取的字节数是否符合预期
    if (rinfile.gcount() != MAX * sizeof(int)) {
        cerr << "读取数据不完整,仅读取了 " << rinfile.gcount() << " 字节" << endl;
    }
    rinfile.close();

    for (int i = 0 ; i < MAX ; i++){
        cout << buffer[i] << " ";
    }
    cout << endl;
    return 0;
}

额外注意事项

  • 文件路径验证:确保程序运行的当前目录与预期一致,避免读写的不是同一个文件。可通过getcwd函数输出当前目录路径进行验证。
  • 权限检查:确认程序对目标目录有读写权限,尤其是在Linux/macOS系统下,避免因权限不足导致操作失败。

内容的提问来源于stack exchange,提问作者DEADPØØL GAMING

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:43:21