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

