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]) + '\n'; 14 break; 15 //统计单词数 16 case "-w": 17 InterfaceCommandable wcmd = new ClassWordCount(); 18 strResult += wcmd.Count(args[args.Length - 1]) + '\n'; 19 break; 20 //统计行数,换行符为准 21 case "-l": 22 InterfaceCommandable lcmd = new ClassRowsCount(); 23 strResult += lcmd.Count(args[args.Length - 1]) + '\n'; 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 }
统计行数
统计传入文件名的文件行数,并将结果返回给统计管理模块。我自己将换行符 “\n” 定义为一行的标记。
代码如下:
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 = { '\n'}; 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比较多。特别是对不同种类的文本文件的处理还有诸多缺陷。