wc.exe
Posted ftsprimadonna
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wc.exe相关的知识,希望对你有一定的参考价值。
github地址:https://github.com/weirdo111/wc.git
WC项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求。
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数(实现)
wc.exe -w file.c //返回文件 file.c 的词的数目(实现)
wc.exe -l file.c //返回文件 file.c 的行数(实现)
扩展功能:
-s 递归处理目录下符合条件的文件。(未实现)
-a 返回更复杂的数据(代码行 / 空行 / 注释行)。(半实现)
解题思路
刚开始拿到题目时,决定用c语言实现。看了题目要求后,根据不同功能设计功能函数,用主函数调用实现。
设计实现过程
设计了6个功能函数,分别用来实现字符数、单词数、行数、空行数、注释行、代码行。其中统计代码行的函数还调用了空行和注释行的函数。
遇到的问题和解决方法
困难描述:在设计单词统计行时,在单词间隔方面遇到了困难
做过的尝试:查询c的相关书籍
是否解决:是。
PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
10 |
10 |
· Estimate |
· 估计这个任务需要多少时间 |
600 |
560 |
Development |
开发 |
20 |
30 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
140 |
· Design Spec |
· 生成设计文档 |
30 |
25 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
5 |
6 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
30 |
40 |
· Design |
· 具体设计 |
30 |
35 |
· Coding |
· 具体编码 |
500 |
400 |
· Code Review |
· 代码复审 |
80 |
180 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
80 |
Reporting |
报告 |
60 |
70 |
· Test Report |
· 测试报告 |
30 |
30 |
· Size Measurement |
· 计算工作量 |
5 |
5 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
10 |
10 |
合计 |
1590 |
1621 |
代码说明
字符统计
1 int charcount(char *filename)//统计字符数 2 { 3 int n1=0; 4 char ch; 5 FILE *fp; 6 if((fp=fopen(filename,"r"))==NULL) 7 { 8 exit(-1); 9 } 10 ch=fgetc(fp); 11 while(!feof(fp)) 12 { 13 ch=fgetc(fp); 14 n1++; 15 } 16 fclose(fp); 17 return n1; 18 }
单词统计
1 int wordcount(char *filename)//统计单词数 2 { 3 int n2=0,word=0; 4 char ch; 5 FILE *fp; 6 if((fp=fopen(filename,"r"))==NULL) 7 { 8 exit(-1); 9 } 10 ch=fgetc(fp); 11 while(!feof(fp)) 12 { 13 ch=fgetc(fp); 14 if(ch<‘A‘||(ch>‘Z‘&&ch<‘a‘)||ch>‘z‘) 15 word=0; 16 else if(word==0) 17 { 18 word=1; 19 n2++; 20 } 21 } 22 fclose(fp); 23 return n2; 24 }
行数统计
int linecount(char *filename)//统计行数 { int n3=0; char ch,lc=0; FILE *fp; if((fp=fopen(filename,"r"))==NULL) { exit(-1); } ch=fgetc(fp); while((ch=fgetc(fp))!=EOF) { if(ch==‘ ‘) n3++; lc=ch; } fclose(fp); if(lc!=‘ ‘) n3++; return n3; }
主函数控制
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int charcount(char *filename); 7 int wordcount(char *filename); 8 int linecount(char *filename); 9 int emplinecount(char *filename); 10 int comlinecount(char *filename); 11 int codelinecount(char *filename); 12 FILE *fp; 13 int c_count,w_count,l_count,e_count,cm_count,cd_count; 14 char ch[3],filename[100]; 15 printf("输入用户命令.exe "); 16 scanf("%s %s",ch,filename); 17 if((fp=fopen(filename,"r"))==NULL) 18 { 19 printf("filenull. "); 20 exit(-1); 21 } 22 //获取命令和输出 23 if(ch[1]==‘c‘) 24 { 25 c_count=charcount(filename); 26 printf("charcalculate=%d ",c_count); 27 } 28 if(ch[1]==‘w‘) 29 { 30 w_count=wordcount(filename); 31 printf("wordcalculate=%d ",w_count); 32 } 33 if(ch[1]==‘l‘) 34 { 35 l_count=linecount(filename); 36 printf("linecalculate=%d ",l_count); 37 } 38 if(ch[1]==‘a‘) 39 { 40 e_count=emplinecount(filename); 41 cm_count=comlinecount(filename); 42 cd_count=codelinecount(filename); 43 printf("emptyline=%d commentline=%d ",e_count,cm_count,cd_count); 44 } 45 return 0; 46 }
测试运行
空文件:
只有一个字符的文件
只有一个单词的文件
只有一行的文件
一个典型的源文件
项目小结
在这次项目中,我学习到了一些新的知识,在写代码过程中,经常被一些小细节给绊住,而且这些细节需要认真思考才能修改出来。另外,扩展功能-a的代码虽然写了,但不能运行。
以上是关于wc.exe的主要内容,如果未能解决你的问题,请参考以下文章