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比较多。特别是对不同种类的文本文件的处理还有诸多缺陷。
CMD程序_WordCount_博客改的更多相关文章
- 微信小程序版博客——开发汇总总结(附源码)
花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...
- java程序设计 彩票购买抽奖程序 团队博客
一.项目介绍 题目要求 功能要求: 模拟福利彩票36选7,实现彩票的抽奖与中奖通知功能. 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票:手 ...
- Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!
大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近想倒腾一下博客,看了很多现成的比较成熟的开源博客系统,自己也简单从下面几个维度总结对比了一下: star数量 ...
- Java课设 彩票购买抽奖程序 个人博客
一.团队课程设计博客链接 http://www.cnblogs.com/lyq063/p/7072507.html 二.自己的代码提交记录截图 三.自己负责模块或任务详细说明 用户注册信息的存储和登录 ...
- phpBOM头(字符)出现的原因以及解决方法_PHP程序员博客|高蒙个人博客
今天在项目中发现,客户端在使用ajax得到返回值时,无法匹配字符串.总是报错,打开页面接口发现,页面的头部出现了的字符(BOM头),找到问题了,那么直接用代码清除掉即可. php隐形字符 // 如 ...
- 如何搭建个人博客网站(Mac)
一直以为自己记忆力很好,毕业之后才发现,之前需要看一遍就能记住的东西,现在看两三遍才能有印象.而搞技术的,如果不及时的记录下当时的情景,过后很容易就忘记.所以,再次萌生了搭博客.写文章的想法(之前用D ...
- 新博客在SEO方面需要注意哪几点?
无论是什么程序的博客,都应该注意这重要的几点! 第一点:网站目标明确进入主题,有些人对于SEO不是特别熟悉,或者说没有接触过.当你做好一个网站,不管网站内容是什么,首先你都得了解最基本的SEO,比如网 ...
- We Talk -- 团队博客
WeTalk --在线群聊程序 团队博客 服务器一直在运行,使用客户端可直接登入使用.(做得很粗糙...) 客户端下载(java环境下直接运行) 0.项目介绍 现在我们网上交流离不开微信和QQ,当然在 ...
- C语言I博客作业06
这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟悉分支结构 这个作业在那个具体方面帮助我实现目标 可以更完整的编写程序及博客园 参考文献 [参考文献](h ...
- flask实战-个人博客-模板 --
模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模 ...
随机推荐
- 【直播回顾】参与ArkUI,共建OpenHarmony繁荣生态
5月31日晚上19点,战"码"先锋第三期直播 <参与ArkUI,共建OpenHarmony繁荣生态> ,在OpenHarmony社群内成功举行. 本期课程,由华为终 ...
- WCHAR 字符串拼接
LPCWSTR GetIniPath() { WCHAR buffer[MAX_PATH]; BOOL result = SHGetSpecialFolderPath(0, buffer, CSIDL ...
- 知识图谱在RAG中的应用探讨
在这篇文章中,我们来详细探讨知识图谱(KG)在RAG流程中的具体应用场景. 缘起 关于知识图谱在现在的RAG中能发挥出什么样的作用,之前看了360 刘焕勇的一个分享,简单的提了使用知识图谱增强大模型的 ...
- Rancher 系列文章-K3S 集群升级
概述 书接上回:<Rancher 系列文章-Rancher 升级>, 我们提到:将 Rancher 用 Helm 从 v2.6.3 升级到 v2.6.4. 接下来开始进行 K3S 集群的升 ...
- 鸿蒙HarmonyOS实战-ArkUI组件(Navigation)
一.Navigation Navigation组件通常作为页面的根容器,支持单页面.分栏和自适应三种显示模式.开发者可以使用Navigation组件提供的属性来设置页面的标题栏.工具栏.导航栏等. 在 ...
- 我自己的JdbcTemplate
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import jav ...
- SRC信息收集方法论
"感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" SRC信息 ...
- maven BUILD FAILURE
maven BUILD FAILURE 使用命令进行导包失败,错误为BUILD FAILURE 然后使用mvn help:system看一下是不是maven有问提 然后出现了新的错误No plugin ...
- CF1913C Game with Multiset 题解
[题目描述] 你有一个空的多重集,你需要处理若干下列询问: ADD $ x $:加入一个数值为 $ 2^x $ 的元素到该多重集. GET $ w $:判断是否存在一个该多重集的子集,使得这个子集的所 ...
- 使用EasyCV Mask2Former轻松实现图像分割
简介: EasyCV可以轻松预测图像的分割谱以及训练定制化的分割模型.本文主要介绍如何使用EasyCV实现实例分割.全景分割和语义分割,及相关算法思想. 作者:贺弘 谦言 临在 导言 图像分割(Ima ...