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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:15:55