C语言使用fread读取.raw文件时无法读取完整内容仅返回168字节问题
问题根因
你读取的.raw是二进制文件,代码中使用"r"文本模式打开文件是核心问题:
- Windows平台下,文本模式读取文件时,遇到字节值为
0x1A(ASCII的EOF控制符)就会终止读取,你文件的第169个字节刚好是0x1A,所以fread只返回了168。 - 文本模式下
ftell的返回值不代表实际字节数,后续用这个值计算读取长度本身就存在误差。
修复方案
- 把fopen的打开模式改为二进制只读模式
"rb":
filePointer = fopen(url, "rb");
- 补充其他代码问题的修正:
- 增加
malloc返回值校验,避免内存分配失败导致访问异常 size_t类型的变量输出要使用%zu格式符,不要用%d,避免类型不匹配导致的输出错误- 标准C的
main函数返回值应为int,不要用void main - 你当前
readFile声明返回char*但实际固定返回0,如果需要返回读取到的内容,要把return 0改为return buffer,并记得在外部使用后手动free释放内存。
修复后的完整参考代码
#include<stdio.h> #include<stdlib.h> char * readFile(char* url){ size_t size, fileSize; char * buffer = 0; FILE *filePointer = fopen(url, "rb"); if(filePointer){ fseek(filePointer, 0, SEEK_END); fileSize = ftell(filePointer); rewind(filePointer); buffer = (char*) malloc(sizeof(char) * (fileSize + 1)); if(buffer == NULL) { fclose(filePointer); return NULL; } size = fread(buffer, 1, fileSize, filePointer); buffer[fileSize] = '\0'; // 如果需要当作字符串使用,补充结束符 fclose(filePointer); printf("%zu %zu ", size, fileSize); } return buffer; } int main(){ char* content = readFile("gc_1024x1024.raw"); if(content) { // 后续处理逻辑 free(content); } return 0; }
内容的提问来源于stack exchange,提问作者Pravin Poudel
相关产品推荐
相关产品推荐

