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

fread函数未读取完整文件问题求助及代码示例

fread 未读取完整文件的排查与修复

从你贴的代码片段来看,我帮你梳理几个最可能导致fread读不全内容的原因,再给你对应的修复方案:

1. 变量类型溢出或不匹配问题

你代码里的duzina、ukupna_duzina、procitano[i]都用了int类型,这里藏着两个隐患:

  • fread的返回值是size_t(无符号整数类型),如果用int接收,当读取字节数超过32位int的最大值(约2GB)时,会发生数值截断,导致你看到的procitano[i]和实际读取量不符。
  • 如果configs[i].length数值较大,configs[i].length * 1048576的结果会直接溢出int的范围,让duzina变成一个错误的小数值,自然读不完预期内容。

修复方法:
把这些变量统一改成size_t类型(或unsigned long long,确保足够容纳大数值):

size_t duzina = (size_t)configs[i].length * 1048576ULL; // 用ULL确保乘法不溢出
printf("Duzina %zu[B]: %zu\n", i+1, duzina);
printf("Duzina %zu[MB]: %zu\n", i+1, duzina/1048576);

size_t ukupna_duzina = 0; // 初始化也要匹配类型
ukupna_duzina += duzina;
printf("Ukupna duzina[B]: %zu\n", ukupna_duzina);
printf("Ukupna duzina[MB]: %zu\n", ukupna_duzina/1048576);

size_t procitano[i] = fread(buffers[i], 1, duzina, fp);
printf("Procitano %zu[B]\n", procitano[i]);

2. 文件打开模式错误(Windows系统需重点注意)

如果你的代码在Windows下运行,且打开文件时用了文本模式(比如fopen("file", "r")),fread会自动把文件里的\r\n转换成\n,导致实际读取的字节数比文件真实大小少;另外文本模式下遇到EOF字符(0x1A)会提前终止读取。

修复方法:
用二进制模式打开文件,在打开模式后加b:

FILE *fp = fopen("你的文件名", "rb"); // rb表示读取二进制文件
if (fp == NULL) {
    perror("Failed to open file");
    return 1;
}

3. 缓冲区内存分配不足

你用到了buffers[i],但如果这个缓冲区没有分配足够的内存(比如只分配了比duzina小的空间),fread会因内存不足无法读取完整内容,甚至可能导致程序崩溃。

修复方法:
确保buffers[i]的分配大小至少等于duzina:

buffers[i] = malloc(duzina);
if (buffers[i] == NULL) {
    perror("Failed to allocate buffer");
    return 1;
}

4. 文件实际大小小于预期的duzina

你计算的duzina是configs[i].length * 1048576,但实际文件的大小可能比这个值小,这时fread只会读取到文件末尾,返回的字节数自然小于duzina。

验证方法:
先获取文件真实大小和duzina对比:

// 定位到文件末尾获取大小
fseek(fp, 0, SEEK_END);
size_t file_size = ftell(fp);
// 回到文件开头准备读取
fseek(fp, 0, SEEK_SET);
printf("实际文件大小[B]: %zu\n", file_size);
if (file_size < duzina) {
    printf("文件大小小于预期值,fread最多读取%zu字节\n", file_size);
}

额外调试技巧

每次调用fread后,用feof和ferror判断是到了文件末尾还是发生了错误:

procitano[i] = fread(buffers[i], 1, duzina, fp);
if (procitano[i] < duzina) {
    if (feof(fp)) {
        printf("已读取到文件末尾,共读取%zu字节\n", procitano[i]);
    } else if (ferror(fp)) {
        perror("fread发生错误");
        clearerr(fp); // 清除错误标志
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:02:42