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
相关产品推荐
相关产品推荐

