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

C语言如何从二进制文件中读取全部数据并以字符串形式输出

问题原因

  • 你使用printf("%s", buf)输出二进制内容是错误的:%s格式符专门用于输出以\0(空字节)结尾的C风格字符串,二进制文件中大量存在\0字节,碰到第一个空字节就会终止打印,这就是你只能读到文件签名的核心原因。
  • fread参数使用错误:你当前写法是fread(buf, sizeof(buf), 1, fp),含义是每次读取1个大小为sizeof(buf)的块,若文件剩余字节不足sizeof(buf),fread会返回0直接终止循环,末尾不足一块的内容会被丢弃。
  • 二进制数据中存在大量不可打印字符,直接输出到终端会出现乱码,不符合二进制内容的查看需求。

修复实现

方案1:读取并打印二进制文件的十六进制内容(方便调试查看)

#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 1024

int main(void) {
    FILE *fp = fopen("whatever.dat", "rb");
    if (!fp) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }

    unsigned char buf[BUFFER_SIZE];
    size_t read_bytes;
    // 调整fread参数:每次读1字节为单位,最多读BUFFER_SIZE个单位,返回实际读到的字节数
    while ((read_bytes = fread(buf, 1, BUFFER_SIZE, fp)) > 0) {
        for (size_t i = 0; i < read_bytes; i++) {
            // 每个字节打印为两位十六进制,空格分隔
            printf("%02X ", buf[i]);
            // 每输出16个字节换行,方便阅读
            if ((i + 1) % 16 == 0) putchar('\n');
        }
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

方案2:如果需要将二进制内容原封不动输出到标准输出

不要使用printf,改用fwrite直接写入字节流:

#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 1024

int main(void) {
    FILE *fp = fopen("whatever.dat", "rb");
    if (!fp) {
        perror("打开文件失败");
        return EXIT_FAILURE;
    }

    unsigned char buf[BUFFER_SIZE];
    size_t read_bytes;
    while ((read_bytes = fread(buf, 1, BUFFER_SIZE, fp)) > 0) {
        // 把实际读到的read_bytes个字节直接写入标准输出
        fwrite(buf, 1, read_bytes, stdout);
    }

    fclose(fp);
    return EXIT_SUCCESS;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:24:03