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

C语言文件行数统计代码返回结果始终比预期少2的问题排查

问题分析与修复

核心问题

你的代码统计行数结果偏少,主要是两个关键错误导致:

  1. 重复调用fgetc:while条件里读取一个字符,if判断里又读取一个字符,相当于每轮循环跳过了一个字符,大量换行符没被检测到,直接导致统计数严重偏低。
  2. 未处理最后一行无换行的情况:如果文件最后一行没有以\n结尾,这行不会被计入总数。

另外还有两个冗余/错误点:

  • 分配的filebuffer完全没用到,属于无效代码
  • fopen的注释标注为"读写",但实际用的是"r"只读模式,注释与代码不符

修复后的代码

// Last task removal
if(!strcmp(argv[2], "last")) {
    int line = 0;
    int current_char; // 存储当前读取的字符

    FILE *fileptr = fopen(FileAddress, "r");
    if (!fileptr) { // 增加文件打开失败的错误处理
        perror("Failed to open file");
        return 1; // 根据你的程序上下文调整错误处理逻辑
    }

    current_char = fgetc(fileptr);
    if (current_char == EOF) {
        line = 0; // 空文件行数为0
    } else {
        line = 1; // 非空文件至少有一行
        while ((current_char = fgetc(fileptr)) != EOF) {
            if (current_char == '\n') { // 用'\n'替代魔法数字10,可读性更强
                line++;
            }
        }
    }

    printf("%d\n", line);
    fclose(fileptr); // 必须关闭文件,避免资源泄漏
}

修复说明

  • 用单个变量current_char存储每次fgetc的结果,避免重复读取字符导致的漏检
  • 先判断文件是否为空,非空文件默认计数为1,解决最后一行无换行时的统计遗漏
  • 添加文件打开失败的判断,防止空指针访问导致程序崩溃
  • 关闭文件释放资源,避免内存泄漏
  • 用'\n'替代数字10,代码可读性更好,也更符合跨平台规范
  • 删除了未使用的filebuffer变量,精简代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 16:17:27