C语言文件行数统计代码返回结果始终比预期少2的问题排查
问题分析与修复
核心问题
你的代码统计行数结果偏少,主要是两个关键错误导致:
- 重复调用
fgetc:while条件里读取一个字符,if判断里又读取一个字符,相当于每轮循环跳过了一个字符,大量换行符没被检测到,直接导致统计数严重偏低。 - 未处理最后一行无换行的情况:如果文件最后一行没有以
\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
相关产品推荐
相关产品推荐

