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

