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

C语言读取大字典txt文件耗时过长,求优化解决方案

解决fgets统计大文件行数死循环的问题

核心问题分析

你的代码陷入死循环的直接原因是循环终止条件完全错误:
原代码用txt_str != EOF判断是否结束循环,但txt_str是字符数组,EOF是表示文件结束的宏(通常定义为-1),两者类型不匹配且永远不可能相等,导致程序无限循环运行。

正确的判断逻辑应该基于fgets的返回值:fgets成功读取内容时返回指向缓冲区的指针,到达文件末尾或读取失败时返回NULL。

修复后的代码

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int line = 0;
    char txt_str[50];
    FILE* pFile;

    pFile = fopen("dict_test.txt", "r");

    if (pFile == NULL) {
        printf("文件不存在或打开失败\n");
        return 1; // 打开失败直接退出,避免后续无效操作
    }
    
    // 以fgets的返回值作为循环终止条件
    while (fgets(txt_str, 50, pFile) != NULL) {
        // 处理长行情况:如果当前读取的内容不含换行符且未到文件末尾,说明该行被拆分
        if (strchr(txt_str, '\n') == NULL && !feof(pFile)) {
            char ch;
            // 跳过该行剩余字符,直到遇到换行或文件结束
            while ((ch = fgetc(pFile)) != '\n' && ch != EOF);
        }
        line++;
    }

    printf("文件行数:%d\n", line);
    fclose(pFile); // 关闭文件,避免资源泄漏
    
    return 0;
}

额外优化说明

  • 增加fclose(pFile):原代码未关闭文件,会造成系统资源泄漏,长期运行的程序必须注意这点。
  • 处理长行统计偏差:如果某一行长度超过50字节,原代码会将其拆分为多次读取,导致行数统计偏多。修复后的代码会跳过拆分后的剩余字符,确保一行只统计一次。
  • 打开失败直接退出:原代码打开失败后仍会执行printf,输出错误的初始行数0,添加return 1避免这种无效输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 11:31:02