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

C语言读取二进制文件输出全零问题排查求助

问题分析与代码修正

你遇到的全零输出问题是由几个关键的代码错误导致的,咱们逐个拆解并修正:

1. 缓冲区类型不匹配

你声明了int *buffer来存储字节数据,但int类型通常占用4或8字节(取决于系统),而你要读取的是单个字节的ASCII值,这会导致内存解析混乱。应该改用unsigned char *(推荐,避免符号位问题)或者char *来存储单字节数据。

2. fread函数参数错误(核心问题)

这是你读到全零的主要原因:

  • 第一个参数:你传了&buffer,这是指针变量本身的地址,但fread需要的是缓冲区的起始地址,直接传buffer即可。
  • 第二个参数:sizeof(buffer)是指针的大小(比如64位系统是8字节),而你需要读取的是单个字节,所以应该传入1。
  • 第三个参数:len是文件的总字节数,正确的fread调用应该是fread(buffer, 1, len, fptr),表示读取len个大小为1字节的元素到缓冲区。

3. 格式符不匹配(次要问题)

你用printf("%d\n", len);输出unsigned long类型的len,应该用%lu来匹配无符号长整型,避免潜在的输出错误。


修正后的完整代码

#include <stdio.h>
#include <stdlib.h>

void bin_byte_by_byte(char *filename) {
    FILE *fptr;
    unsigned long len;
    unsigned char *buffer; // 改为unsigned char类型存储单字节

    fptr = fopen(filename, "rb");
    if(!fptr) {
        printf("error: file does not exist");
        return;
    }

    // 获取文件长度
    fseek(fptr, 0, SEEK_END);
    len = ftell(fptr);
    fseek(fptr, 0, SEEK_SET);

    // 分配对应字节数的内存
    buffer = (unsigned char*)malloc(sizeof(unsigned char) * len);
    if(!buffer) {
        printf("error: unable to allocate memory");
        fclose(fptr);
        return;
    }

    // 正确调用fread:读取len个1字节的元素
    size_t read_count = fread(buffer, 1, len, fptr);
    // 可选:检查实际读取的字节数是否和预期一致
    if(read_count != len) {
        printf("warning: only read %zu bytes out of %lu\n", read_count, len);
    }

    printf("len = %lu\n", len); // 用%lu匹配unsigned long
    for(unsigned long i = 0; i < len; i++) {
        printf("%d ", buffer[i]); // 输出ASCII值,用%d没问题
    }
    printf("\n"); // 换行让输出更整洁

    if(fclose(fptr) != 0) {
        printf("File did not close as expected");
    }
    free(buffer);
}

测试效果

当你读取内容为"this"的binary.bin时,这段代码会输出:

len = 4
116 104 105 115 

正好对应't'、'h'、'i'、's'的ASCII值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:30:50