基于C实现Word Count 将字符数、单词数、行数,统计结果以指定格式输出到默认文件中

基于C实现Word Count ---系统分析与设计课程个人项目作业

1. 项目地址:

[gitee地址] (https://gitee.com/little-baby/WordCount-by-C )

2. 项目简介

WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

3. 项目要求

  • 可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
  • wc.exe [parameter] [input_file_name]
  • 存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

4. 需求分析

  • 根据输入显示出给定文件的大致信息,具体包括字符数、单词数、行数(基本功能),显示注释行、空行...(扩展功能) 、以图形界面展示信息(高级功能).
  • 根据用户的输入选择目标文件,根据用户的输入判定是否生成新输出文件.
  • 具体说明如下:
    - 用户在命令行运用如下格式命令执行程序:wc.exe [ 参数 ] 输入文件名 [ -o ] 输出文件名.
    - 对于参数选项具体说明:至少存在一项(-w :统计文件,-l 统计行数,-c :统计字符).
    - 对于输入文件名选项具体说明:不可省略.
    - -o选项具体说明:可省略.
    - 对输出文件名选项具体说明:可省略,但倘若出现,前面一定跟着输出"-o"参数.

5. PSP表格

PSP2.1 PSP阶段 预估耗时(分钟) 实际耗时(分钟 )
Planning 计划 100 55
Estimate 估计这个任务需要多少时间 60 30
Development 开发 100 180
Analysis 需求分析 (包括学习新技术) 90 80
Design Spec 生成设计文档 60 45
Design Review 设计复审 (和同事审核设计文档) 45 20
Coding Standard 代码规范 (为目前的开发制定合适的规范) 25 15
Design 具体设计 60 80
Coding 具体编码 60 120
Code Review 代码复审 20 60
Test 测试(自我测试,修改代码,提交修改) 45 90
Reporting 报告 60 75
Test Report 测试报告 30 30
Size Measurement 计算工作量 30 35
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 60
合计 815 975

6. 具体实现过程

-6.1 所需要解决的几个关键问题??
1).对于在命令行的读取输入,读取出输入信息
2).如何识别参数,即识别所输入的不同的参数
3).对于不同参数,如何调用调用实现所要达到的功能
-6.2 可行的几个解决方案
① 参见C语言命令行参数的使用
② 借助C语言库函数strcmp与指定的字符串进行比较
③ 由上可知,当识别出不同的参数时,直接调用不同的函数即可.

7. 部分实现代码

  • 文件操作
char* filename(int argc,char** arg) //返回文件名
{
    int i=0;
    char* name;
    for(i=1;i<argc;i++)
    {
      if(strcmp(arg[i],"-l")&&strcmp(arg[i],"-w")&&strcmp(arg[i],"-c"))
      {
         return arg[i]; 
      }
    }   
}
void openfile(int argc,char** arg) //打开文件 
{   
     char *name=filename(argc,arg);   
     fp = fopen(name,"r");
}
  • 统计行数
void LineCount(int argc,char** arg,char* filename) //统计行数 
{    
    char c; 
    openfile(argc, arg);
    while(!feof(fp))
    {
       c=fgetc(fp);
       if(c=='\n')
       {
        hang_num++;   
       }
    }  
     FILE* fp1 = fopen( filename,"a+");
     fprintf( fp1,"行数%d\n",hang_num+1);
     fclose(fp);
     fclose( fp1 );
}
  • 统计字符
void CharCount(int argc,char** arg,char* filename) // 统计字符 
{
    char c; 
    openfile(argc, arg);
    while(!feof(fp))
    {
       c=fgetc(fp);
       if(c!='\n')
       {
        number++;   
       } 
   }
     FILE* fp1 = fopen( filename,"a+");
     fprintf( fp1,"字符数%d\n",number);
     fclose(fp);
     fclose( fp1 );
}
  • 统计单词
void WordCount(int argc,char** arg,char* filename ) //统计单词
{
    char c;
    openfile(argc, arg);
    while(!feof(fp))
    {   
        c=fgetc(fp);
        if( c == '\n' || c == ' ')
        {
            count++;
        }
    }   
     FILE* fp1 = fopen( filename,"a+");
     fprintf( fp1,"词数%d\n",number);
     fclose(fp);
     fclose( fp1 );
}
  • 显示顺序与输入参数的次序无关
void handle(int argc,char** arg)
{
    int i=1;
    char* filename ="result.txt";   
    bool IshaveParameter[10]={false}; 
        for(i = 1;i < argc; i++)
        {
          if(!strcmp(arg[i],"-w"))
           {
           IshaveParameter[0]=true;     
           }
           else if(!strcmp(arg[i],"-c"))
           {
           IshaveParameter[1]=true; 
           }
           else if (!strcmp(arg[i],"-l"))
              {
            IshaveParameter[2]=true;    
           }
        }        
        for(i = 1;i < argc; i++)
        {
          if(!strcmp(arg[i],"-o"))
           {
                 filename = arg[ i + 1 ];
           }   
        }                   
    for(i = 0;i < argc;i ++ )
    {   
      if(i==0&&IshaveParameter[i]==true)
      {         
            CharCount(argc, arg,filename);      
      }
      else if(i==1&&IshaveParameter[i]==true)
      {
               WordCount(argc, arg,filename);
      }
      else if(i==2&&IshaveParameter[i]==true)
      {
              LineCount(argc, arg,filename);
      }
    
    }
}

8. 程序测试

  • 涉及多项统计,如同时需要统计字符、单词和行数,则按照字符-->单词-->行数-->代码行数/空行数/注释行的顺序,依次分行显示。
    • 显示顺序与输入参数的次序无关。

    • 生成文件result.txt:

    • 例如:
      wc.exe -l -w -c file.c,则统计file.c中的字符数和行数,输出结果保存在result.txt中,内容格式如下:

参考

猜你喜欢

转载自www.cnblogs.com/this-cong/p/9696790.html
今日推荐