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

C语言使用fread读取.raw文件时无法读取完整内容仅返回168字节问题

问题根因

你读取的.raw是二进制文件,代码中使用"r"文本模式打开文件是核心问题:

  • Windows平台下,文本模式读取文件时,遇到字节值为0x1A(ASCII的EOF控制符)就会终止读取,你文件的第169个字节刚好是0x1A,所以fread只返回了168。
  • 文本模式下ftell的返回值不代表实际字节数,后续用这个值计算读取长度本身就存在误差。
修复方案
  1. 把fopen的打开模式改为二进制只读模式"rb":
filePointer = fopen(url, "rb");
  1. 补充其他代码问题的修正:
  • 增加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:45:04