GitHub地址:https://github.com/dog-bear/Count
1、项目要求
wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、单词数和行数。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:
wc.exe [parameter] [file_name]
基本功能列表:
wc.exe -c file.c //返回文件 file.c 的字符数 (实现)
wc.exe -w file.c //返回文件 file.c 的词的数目 (实现)
wc.exe -l file.c //返回文件 file.c 的行数 (实现)
扩展功能:
-s 递归处理目录下符合条件的文件(实现)
-a 返回更复杂的数据 (实现)
2、psp表
*PSP2.1* | *Personal Software Process Stages* | *预估耗时(分钟)* | *实际耗时(分钟)* |
---|---|---|---|
Planning | 计划 | 45 | 20 |
·Estimate | · 估计这个任务需要多少时间 | 45 | 20 |
Development | 开发 | 705 | 482 |
· Analysis | · 需求分析 (包括学习新技术) | 180 | 75 |
· Design Spec | · 生成设计文档 | 10 | 10 |
·Design Review | · 设计复审 (和同事审核设计文档) | 15 | 25 |
·Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 10 | 12 |
· Design | · 具体设计 | 30 | 20 |
· Coding | · 具体编码 | 200 | 165 |
· Code Review | · 代码复审 | 60 | 55 |
· Test | · 测试(自我测试,修改代码,提交修改) | 200 | 120 |
Reporting | 报告 | 120 | 70 |
· Test Report | · 测试报告 | 40 | 25 |
·Size Measurement | · 计算工作量 | 40 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 40 | 20 |
合计 | 870 | 572 |
3、解题思路
把功能分成5个模块,分模块编写,然后main函数组合起来。首先要先去找c语言文件的读入,以及如何在行内进行一个准确的判断(为-a准备),-s主要是学会把握句柄然后进行当前目录下的查找。围绕这些网上查找接口函数和实现思路。
4、设计实现过程
一共5个功能模块函数和一个main主函数。可以用字符查找函数对词函数先进行一个空判定。返回复杂数据的代码行也可以用字符查找进行判定。注释行用到了两个标记进行确认。
5、代码说明
统计字符数
利用非字符进行排查和判定。
//字符统计
int charcount(char *file)
{
int c=0;
FILE *fp;
char a;
fp=fopen(file,"r");
while(!feof(fp))
{
a=fgetc(fp);
if(a!=' '&&a!='\n'&&a!='\t')
c++;
}
fclose(fp);
c--;
return c;
}
统计词数
用到一个标记t,当标记遇到字符是会判定1,若是遇到非字符时候,判定为1,则词数增加,而且判定归0。
//词数统计
int wordcount(char *file)
{
int w=0;
FILE *fp;
char a;
int t=0;
fp=fopen(file,"r");
if (charcount(file)==0)
w=0;
else
{
while(!feof(fp))
{
a=fgetc(fp);
if(a==' '||a=='\n'||a=='\t'||a==EOF){
if(t==1){
w++;
t=0;
}
}
else t=1;
}
}
fclose(fp);
return w;
}
统计行数
根据换行符进行判定。
//行数统计
int linecount(char *file)
{
int l=0;
FILE *fp;
fp=fopen(file,"r");
char a;
while(!feof(fp))
{
a=fgetc(fp);
if(a=='\n')
l++;
}
fclose(fp);
l++;
return l;
}
寻找目录下符合条件文件
//寻找目录下txt,cpp文件
int searchfile(void)
{
struct _finddata_t fileinfo;
long fHandle;
int t=0;
if( (fHandle=_findfirst( "*txt", &fileinfo )) == -1L )
{
printf( "当前目录下没有txt文件\n");
}
else
do{
t++;
printf("找到文件:%s\n", fileinfo.name);
}while (_findnext(fHandle,&fileinfo)==0);
_findclose(fHandle);
printf("txt文件数量:%d\n",t);
return 0;
}
返回复杂数据
首先以换行符进行区分,遇到一个换行符或者终止符进行一次判定。
若是遇到字符行,则判定为代码行。
若遇到‘/’两次出现,则认定为注释行。
其余为空行。
//返回更多数据
int LineData(char *file){
FILE *fp;
fp=fopen(file,"r");
char a;
int tag=0,tag2=0,Blank_line=0,Code_Line=0,Comment_Line=0;
while(!feof(fp)){
a=fgetc(fp);
if(a=='\n'||a==EOF){
if(tag==1)
Code_Line++;
if(tag==2)
Comment_Line++;
tag2=0;
if(tag==0)
Blank_line++;
tag=0;
}else{
if(a!=' '&&a!='\n'&&a!='\t'&&a!='{'&&a!='}'){
if(a=='/'){
if(tag2==1)
tag=2;
tag2=1;
}
if(tag!=2)
tag=1;
}
}
}
fclose(fp);
printf("空行数为:%d\n",Blank_line);
printf("代码行数为:%d\n",Code_Line);
printf("注释行数为:%d\n",Comment_Line);
return Blank_line+Code_Line+Comment_Line;
}
main函数
//主函数
int main (int argc, char *argv[])
{
int i;
for(i=1;i
6、测试运行
空文件
只有一个字符的文件
只有一个词的文件
只有一行的文件
本程序源文件
7、项目小结
1、github运用不熟练,下载安装耗去了一部分时间。
2、对psp开发感觉不适应,做的准备工作太多,到实际开发上不能应用起来。
3、测试和修改次数过多,初版代码错误地方太多。还是准备不够充分,心态容易急躁。