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

C++ 读取二进制文件input.bin时输出结果与实际数据不符问题咨询

问题原因分析
  • 第一个核心错误是重复调用了read方法,导致首次读取的有效内容被覆盖、文件指针异常偏移:
    你的代码在打开文件后先执行了一次myFile.read(buffer, 100),这一步已经把整个32字节的input.bin文件内容全部读入buffer,此时文件指针已经移动到文件末尾,buffer[0]本应是你预期的0x0f。
    但你在if判断条件中又执行了一次myFile.read(buffer, 100),这次读取会尝试从文件末尾位置再读100字节,读取到的内容会直接覆盖buffer原有数据,同时流的状态位会被更新。你现在看到的错位的0x18(十进制24),是因为第二次读取失败时,buffer中残留了第一次读取到的偏移位置的数据,并非你预期的文件头部前4字节。
  • 第二个错误是文件读取成功的判断逻辑完全错误:
    你当前的逻辑是先无条件读两次文件,再判断第二次读取是否失败,完全没有校验文件是否成功打开、第一次读取是否有效,自然无法得到预期的文件头部输出。
修正方案

修正后的代码如下:

#include <iostream>
#include <fstream>
#include <iomanip>

int main()
{
    char buffer[100];
    std::ifstream myFile("input.bin", std::ios::in | std::ios::binary);
    // 先判断文件是否成功打开
    if (!myFile.is_open()) {
        std::cout << "Could not open the required file\n";
        return 1;
    }
    // 仅调用一次read,判断读取是否成功
    if (!myFile.read(buffer, 100)) {
        std::cout << "Failed to read file content\n";
        myFile.close();
        return 1;
    }
    // 输出前4个字节
    for (int i = 0; i < 4; i++)
    {
        std::cout << "buffer[" << i << "] = 0x" << std::hex << static_cast<unsigned>(static_cast<unsigned char>(buffer[i])) << std::endl;
    }
    myFile.close();
    return 0;
}

修正后运行会得到预期输出:

buffer[0] = 0xf
buffer[1] = 0x0
buffer[2] = 0x0
buffer[3] = 0x4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:15:08