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文件加工为模板,并创建对应的表单类,在模 ...
随机推荐
- 【资料包】HDC.Together 2023精选Codelabs指南现已上线(内有活动)
今年HDC.Together 2023的Codelabs挑战系列活动如期而至,众多开发者齐聚一堂,积极参与.本次赛题中部分Codelabs已在官网上线详细操作指南,让我们与众多coders一起探索代 ...
- 在 macOS Big Sur 上安装 MySQL 8.x Compressed TAR Archive
因个人能力有限,文章难免存在错误,望斧正,感谢. 版本: macOS 11.6 Intel版本 MySQL 8.0.26 Compressed TAR Archive 一.准备所需文件 前往 MySQ ...
- RestfulApi 学习笔记——内容协商(三)
前言 什么是内容协商呢?是这样的,我们在请求的时候都有两个属性,一个是Content-Type,另一个是accept,这两个什么意思呢? content-type 这个是表示自己传输的是什么内容,就像 ...
- ES6中新增的Set、Map两种数据结构
如果要用一句话来描述,我们可以说 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构 什么是集合?什么又是字典? 集合是由一堆无序的.相关联的,且不重复的内存结构[数学中称为元素]组成的组 ...
- 《C# in depth》第5章C#5.0中的更改(十三)——異步枚舉器
一.異步枚舉 异步枚举器(Async Enumerator)是指一种异步迭代器,可以用于处理异步数据源.它允许我们以异步的方式逐个读取数据源中的元素. 在传统的同步枚举器中,当我们遍历一个集合时,程序 ...
- ASP.NET Core Web API下基于Keycloak的多租户用户授权的实现
在上文<Keycloak中授权的实现>中,以一个实际案例介绍了Keycloak中用户授权的设置方法.现在回顾一下这个案例: 服务供应商(Service Provider)发布/Weathe ...
- 力扣430(java)-扁平化多级双向链表(中等)
题目: 你会得到一个双链表,其中包含的节点有一个下一个指针.一个前一个指针和一个额外的 子指针 .这个子指针可能指向一个单独的双向链表,也包含这些特殊的节点.这些子列表可以有一个或多个自己的子列表,以 ...
- 开源小白到核心开发——我与 sealer 的成长故事
简介: 下面将以作者本人与 sealer 的一段成长故事来带领大家体验从小白到核心功能开发者的开源之旅,同时本文也作为一篇引领开源小白入门的文章供大家参考. 作者:周欣元 个人简介 大家好,我是周 ...
- MSE 治理中心重磅升级-流量治理、数据库治理、同 AZ 优先
简介: 本次 MSE 治理中心在限流降级.数据库治理及同 AZ 优先方面进行了重磅升级,对微服务治理的弹性.依赖中间件的稳定性及流量调度的性能进行全面增强,致力于打造云原生时代的微服务治理平台. 作者 ...
- 【产品能力深度解读】连续入围Gartner魔力象限的Quick BI有何魔力?
简介: 国际权威分析机构Gartner发布2021年商业智能和分析平台魔力象限报告,阿里云Quick BI再度入选,并继续成为该领域魔力象限唯一入选的中国企业. Quick BI凭借在增强分析能力上的 ...