• CMD程序_WordCount_博客改


    程序简介

    这个程序只能以命令行的方式启动,在启动时要输入相应的命令。程序的功能是对文本文件的字符数,单词数,行数进行统计,将结果输出到默认文件或指定文件。

    码云项目链接:WordCount

    程序结构

    程序功能

    功能调度

    用户输入的数据用main函数的args[]参数获取。mian函数调用统计管理模块。统计管理模块根据用户的的命令,

    选择相应的功能模块执行,并得到他们的返回数据。刚开始用了很多if_else语句实现根据命令来调用具体的功能处理

    模块,后来将这些代码分解出来成为单独的模块。之后有了时间才开始思考简化代码的事,于是有了下面的代码:

     

     1 public static string CountDeal(string[] args)
     2         {
     3             string strResult = "";
     4             //根据用户参数个数调用统计模块
     5             int i=0;            
     6             while(i<args.Length-1)
     7             {
     8                 switch (args[i])
     9                 {
    10                     //统计字符数
    11                     case "-c":
    12                         InterfaceCommandable ccmd = new ClassCharCount();
    13                         strResult += ccmd.Count(args[args.Length-1]) + '
    ';
    14                         break;
    15                     //统计单词数
    16                     case "-w":
    17                         InterfaceCommandable wcmd = new ClassWordCount();
    18                         strResult += wcmd.Count(args[args.Length - 1]) + '
    ';
    19                         break;
    20                     //统计行数,换行符为准
    21                     case "-l":
    22                         InterfaceCommandable lcmd = new ClassRowsCount();
    23                         strResult += lcmd.Count(args[args.Length - 1]) + '
    ';
    24                         break;
    25                     case "-o":
    26                         //更改输出到用户指定的文件
    27                         OutClass.ChangePrint(args[args.Length - 1]);
    28                         break;
    29                     default:
    30                         Console.WriteLine("命令错误");
    31                         break;
    32                 }
    33                 i++;
    34             }
    35             //返回统计结果
    36             return strResult;
    37         }

    统计字符数

    统计传入文件名的文件字符数,并将结果返回给统计管理模块。

     代码如下:

     1 public class ClassCharCount:InterfaceCommandable
     2     {
     3          public string Count(string fileName)
     4          {
     5              string strResult = "字符数:";
     6              try
     7              {
     8                  FileStream fs = new FileStream(fileName, FileMode.Open);
     9                  strResult += Convert.ToString(fs.Length);
    10                  fs.Close();
    11                  Console.WriteLine("字符数统计成功");
    12                  return strResult;
    13              }
    14              catch
    15              {
    16                  Console.WriteLine("文件打开失败");
    17                  return strResult;
    18              }           
    19          }
    20     }

    统计单词数

    统计传入文件名的文件字符数,并将结果返回给统计管理模块。根据要求,这里把两个逗号或空格之间的字符定义为单词。

    代码如下:

     1 public string Count(string fileName)
     2         {
     3             string strResult = "单词数:";
     4             try
     5             {
     6                 FileStream fs = new FileStream(fileName, FileMode.Open);
     7                 StreamReader sr = new StreamReader(fs, Encoding.Default);
     8                 string sen = Convert.ToString(sr.ReadToEnd());
     9                // Console.WriteLine(sen);//检查读文件结果
    10                 fs.Close();
    11                 sr.Close();
    12                 char[] separator={',',' ',''};//中英文逗号及空格
    13                 string[] words = sen.Split(separator, StringSplitOptions.RemoveEmptyEntries);//按指定字符分割字符串
    14                 strResult += Convert.ToString(words.Length);
    15                 Console.WriteLine("单词数统计成功");
    16                 return strResult;
    17             }
    18             catch
    19             {
    20                 Console.WriteLine("文件打开失败");
    21                 return strResult;
    22             }       
    23         }

    统计行数

    统计传入文件名的文件行数,并将结果返回给统计管理模块。我自己将换行符 “ ” 定义为一行的标记。

    代码如下:

     1 public string Count(string fileName)
     2         {
     3             string strResult = "行数:";
     4             try
     5             {
     6                 FileStream fs = new FileStream(fileName, FileMode.Open);
     7                 StreamReader sr = new StreamReader(fs, Encoding.Default);
     8                 string sen = Convert.ToString(sr.ReadToEnd());
     9                 // Console.WriteLine(sen);//检查读文件结果
    10                 fs.Close();
    11                 sr.Close();
    12 
    13                 char[] separator = { '
    '};
    14                 string[] Rows = sen.Split(separator, StringSplitOptions.RemoveEmptyEntries);//按指定字符分割字符串
    15                 strResult += Convert.ToString(Rows.Length);
    16                 Console.WriteLine("行数统计成功");
    17                 return strResult;
    18             }
    19             catch
    20             {
    21                 Console.WriteLine("打开文件失败");
    22                 return strResult;
    23             }
    24         }

    功能接口

    由于上面三个功能类似,于是在正式实现具体的功能模块前,我先定义了一个接口,以便于具体功能的实现。三个模块都实现Count功能,利用多态性实现了各个模块的调用。

    代码如下:

    1 interface InterfaceCommandable
    2     {
    3         string Count(string fileName);
    4     }

    更改输出模块

    这个函数将用户指定的文件名保存在一个专门的为文件中。在输出统计数据时根据里面的内容确定输出文件——本该这样,但我在时间匆忙下将这段代码写在了main函数里。。。

    也是没有在设计时设计好。

    代码如下:

     1 public static void ChangePrint(string fileName)
     2         {
     3             try
     4             {
     5                 StreamWriter sw = new StreamWriter("resultposition.txt");
     6                 sw.Write(fileName);
     7                 sw.Close();
     8                 Console.WriteLine("输出地址更改成功");
     9             }
    10             catch
    11             {
    12                 Console.WriteLine("输出地址更改失败");
    13             }
    14             
    15         }

    写在mian函数里的那段代码如下:

     1  //根据输出地址调用输出模块将统计结果输出到指定文件
     2             StreamReader sr = new StreamReader("resultposition.txt");
     3             string position=sr.ReadToEnd();
     4             sr.Close();
     5             if(position==""||position=="result.txt")
     6             {
     7                 OutClass.Print(strResult);
     8             }
     9             else
    10             {
    11 
    12                 OutClass.Print(strResult, position);
    13             }

    输出模块

    本着一个模块只做一件事的原则,将输出代码分解出来。

    代码如下:

     1 public static class OutClass
     2     {
     3         public static void Print(string strResult)
     4         {
     5                 try
     6                     {
     7                           StreamWriter sw = new StreamWriter("result.txt");
     8                           sw.WriteLine(strResult);//将结果写入默认文件
     9                           Console.WriteLine("数据写入成功");
    10                           sw.Close();
    11                     }
    12                 catch
    13                     {
    14                           Console.WriteLine("数据写入失败");
    15                     }
    16         }
    17 
    18         public static void Print(string strResult,string args)
    19         {
    20             try
    21             {
    22                 StreamWriter sw = new StreamWriter(args);
    23                 sw.WriteLine(strResult);//将结果写入指定文件
    24                 Console.WriteLine("数据写入成功");
    25                 sw.Close();
    26             }
    27             catch
    28             {
    29                 Console.WriteLine("数据写入失败");
    30             }
    31         }
    32             
    33         
    34 
    35 
    36         public static void ChangePrint(string fileName)
    37         {
    38             try
    39             {
    40                 StreamWriter sw = new StreamWriter("resultposition.txt");
    41                 sw.Write(fileName);
    42                 sw.Close();
    43                 Console.WriteLine("输出地址更改成功");
    44             }
    45             catch
    46             {
    47                 Console.WriteLine("输出地址更改失败");
    48             }
    49             
    50         }
    51     }

    其实更改输出模块的代码也还没有分解出来。。。

     关于测试

    由于写程序时的时间比较紧,就没有进行测试,因此BUG比较多。特别是对不同种类的文本文件的处理还有诸多缺陷。

  • 相关阅读:
    SHAREPOINT2007 文档库中通过EMAIL发送文档URL为乱码的解决方法
    ReadTrace
    实战分区表:SQL Server 2k5&2k8系列
    mssql 如何创建跟踪
    SQL Server自定义异常的使用raiserror
    SQL Server 2008内存及I/O性能监控
    实战 SQL Server 2008 数据库误删除数据的恢复
    MSSQL常用性能測試語句
    sqlserver 2008 设置了镜像 如何收缩日志文件
    复制订阅错误处理。
  • 原文地址:https://www.cnblogs.com/ggtc/p/9733605.html
Copyright © 2020-2023  润新知