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比较多。特别是对不同种类的文本文件的处理还有诸多缺陷。

原文地址:https://www.cnblogs.com/ggtc/p/9733605.html