C语言计算文件校验和出现段错误,求技术解决方案
问题分析与修复方案
段错误的直接原因
fopen调用可能失败(比如文件不存在、无读取权限、路径错误),此时返回的fp是NULL指针。对NULL指针调用feof()或ferror()会直接触发段错误,这就是你遇到的问题。
代码的其他问题
原代码的循环条件!feof(fp)是C语言的经典误区:feof只有在已经读取到文件末尾之后才会被置位,所以最后一次fgetc(fp)会返回EOF,但循环仍然会执行一次,把EOF(转换为unsigned char是0xFF)异或到校验和里,导致结果错误。
另外,逐个字节用fgetc读取100MB文件效率极低,建议用批量读取的方式提升速度。
修复后的代码
#include <stdio.h> #include <stdlib.h> int CheckSumCalc(const char *filename) { // 打开文件,立即检查是否成功 FILE *fp = fopen(filename, "rb"); if (fp == NULL) { perror("Failed to open file"); return -1; // 返回错误码表示失败 } unsigned char checksum = 0; // 用缓冲区批量读取,提升大文件处理效率 unsigned char buf[4096]; size_t bytes_read; while ((bytes_read = fread(buf, 1, sizeof(buf), fp)) > 0) { for (size_t i = 0; i < bytes_read; i++) { checksum ^= buf[i]; } } // 检查是否读取过程中出错 if (ferror(fp)) { perror("Error reading file"); fclose(fp); return -1; } fclose(fp); return checksum; }
关键修复点
- 增加
fopen后的空指针检查,避免对NULL指针操作 - 改用
fread批量读取缓冲区,大幅提升大文件处理效率 - 循环条件基于
fread的返回值,自然处理文件末尾,避免feof的误区 - 增加读取过程中的错误检查,能及时反馈读取失败的情况
内容的提问来源于stack exchange,提问作者ATB
相关产品推荐
相关产品推荐

