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

