仿wc程序行计数变量始终为0的问题求助
问题分析与修复
你的行计数始终为0,是由几个关键错误导致的,逐一解决如下:
1. 文件指针未重置到开头
你用fseek(file, 0L, SEEK_END)获取文件字节数后,文件指针停在了文件末尾,此时后续的getc(file)直接返回EOF,循环根本不会执行,自然行计数为0。
解决方法:在开始行计数前,用rewind(file)将指针重置到文件开头,或者再次调用fseek(file, 0L, SEEK_SET)。
2. 条件判断用了赋值而非比较
代码中if (chr = '\n')是赋值操作(把'\n'赋值给chr),不是相等比较。即使循环执行,这个条件也会始终为真(因为'\n'的ASCII值非0),导致错误计数;但因为前面指针在末尾,这个问题没暴露出来。
正确写法是用双等号:if (chr == '\n')。
3. 字符变量类型错误
getc()返回的是int类型(包含EOF这个超出char范围的值),如果用char chr存储,可能会因为符号扩展问题无法正确识别EOF,导致循环异常。
需要把chr的类型改为int。
4. 循环逻辑跳过了第一个字符
你的代码先执行chr = getc(file);,进入循环后又立刻chr = getc(file);,这会跳过文件的第一个字符。如果文件开头是换行符,会漏计一行;同时如果文件为空,也会导致错误。
调整循环逻辑,让getc()在循环内统一执行。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { if (argc == 2) { FILE* file = fopen(argv[1], "r"); int chr; if (!file) { perror("Error opening file"); return EXIT_FAILURE; } // 获取字节数后重置指针 fseek(file, 0L, SEEK_END); int bytes = ftell(file); rewind(file); // 重置到文件开头 int lines = 0; while ((chr = getc(file)) != EOF) { if (chr == '\n') lines++; } int words = 0; printf("%d %d %d %s\n", lines, words, bytes, argv[1]); fclose(file); } else { printf("Usage:\n"); printf("%s <-cml> <filename>\n", argv[0]); printf("%s <filename>\n", argv[0]); } return 0; }
额外提示:全局变量FILE* file;没必要,直接在main里定义局部变量更安全。
内容的提问来源于stack exchange,提问作者TeenProgrammer
相关产品推荐
相关产品推荐

