程序简介

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

码云项目链接: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_博客改的更多相关文章

  1. 微信小程序版博客——开发汇总总结(附源码)

    花了点时间陆陆续续,拼拼凑凑将我的小程序版博客搭建完了,这里做个简单的分享和总结. 整体效果 对于博客来说功能页面不是很多,且有些限制于后端服务(基于ghost博客提供的服务),相关样式可以参考截图或 ...

  2. java程序设计 彩票购买抽奖程序 团队博客

    一.项目介绍 题目要求 功能要求: 模拟福利彩票36选7,实现彩票的抽奖与中奖通知功能. 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票:手 ...

  3. Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!

    大家好!我是 Guide 哥,Java 后端开发.一个会一点前端,喜欢烹饪的自由少年. 最近想倒腾一下博客,看了很多现成的比较成熟的开源博客系统,自己也简单从下面几个维度总结对比了一下: star数量 ...

  4. Java课设 彩票购买抽奖程序 个人博客

    一.团队课程设计博客链接 http://www.cnblogs.com/lyq063/p/7072507.html 二.自己的代码提交记录截图 三.自己负责模块或任务详细说明 用户注册信息的存储和登录 ...

  5. phpBOM头(字符&#65279;)出现的原因以及解决方法_PHP程序员博客|高蒙个人博客

    今天在项目中发现,客户端在使用ajax得到返回值时,无法匹配字符串.总是报错,打开页面接口发现,页面的头部出现了的字符(BOM头),找到问题了,那么直接用代码清除掉即可. php隐形字符 // 如 ...

  6. 如何搭建个人博客网站(Mac)

    一直以为自己记忆力很好,毕业之后才发现,之前需要看一遍就能记住的东西,现在看两三遍才能有印象.而搞技术的,如果不及时的记录下当时的情景,过后很容易就忘记.所以,再次萌生了搭博客.写文章的想法(之前用D ...

  7. 新博客在SEO方面需要注意哪几点?

    无论是什么程序的博客,都应该注意这重要的几点! 第一点:网站目标明确进入主题,有些人对于SEO不是特别熟悉,或者说没有接触过.当你做好一个网站,不管网站内容是什么,首先你都得了解最基本的SEO,比如网 ...

  8. We Talk -- 团队博客

    WeTalk --在线群聊程序 团队博客 服务器一直在运行,使用客户端可直接登入使用.(做得很粗糙...) 客户端下载(java环境下直接运行) 0.项目介绍 现在我们网上交流离不开微信和QQ,当然在 ...

  9. C语言I博客作业06

    这个作业属于哪个课程 C语言程序设计I 这个作业要求在哪里 作业链接 我在这个课程的目标是 熟悉分支结构 这个作业在那个具体方面帮助我实现目标 可以更完整的编写程序及博客园 参考文献 [参考文献](h ...

  10. flask实战-个人博客-模板 --

    模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模 ...

随机推荐

  1. OpenHarmony Meetup常州站招募令

    OpenHarmony Meetup 常州站正火热招募中! 诚邀充满激情的开发者参与线下盛会~ 探索OpenHarmony前沿科技,畅谈未来前景, 感受OpenHarmony生态构建之路的魅力! 线下 ...

  2. 聊聊ChatGLM3多用户并发API调用的问题

    转载请备注出处:https://www.cnblogs.com/zhiyong-ITNote 背景 目前在公司内部4张A10的GPU服务器上部署了ChatGLM3开源模型:然后部署了官方默认的web_ ...

  3. 【Insights直播】3D建模服务,快速构建高质量3D模型

    2021年7月15日,HMS Core 6.0面向全球开发者正式上线.华为在HMS Core 6.0中,为开发者开放了一个全新的服务--3D建模服务(3D Modeling Kit),为应用开发者提供 ...

  4. sql注入--基础注入判断方法(构造闭合)

    在我们拿到一个sql注入的题目之后,在确定了注入点之后,接下来要做的事情就是进行基础注入判断. 在开始前,我们需要理解一个SQL注入中最常用的词汇 -- 构造闭合 . 对于SQL处理语句后台的写法: ...

  5. HarmonyOS实现几种常见图片点击效果

    一. 样例介绍 HarmonyOS提供了常用的图片.图片帧动画播放器组件,开发者可以根据实际场景和开发需求,实现不同的界面交互效果,包括:点击阴影效果.点击切换状态.点击动画效果.点击切换动效. 相关 ...

  6. 嘉楠k210 多线程 点亮流水灯

    from Maix import GPIO from fpioa_manager import fm import _thread import time fm.register(24, fm.fpi ...

  7. 实际项目中一般使用到的git知识

    1.项目上线分支管理流程 图片压缩太厉害有些模糊 700k 压缩到20多k 清晰些的图片地址https://project.zdzspace.cn/test-vuekey 2.一些常用的git命令 g ...

  8. D365虚拟机安装

    原本有本地VM是2023.3.31安装的,奈何微软不断升级,导致程序一些新特性用不到,例如: 1,Master Planning ---> Planning Optimization, 2,mi ...

  9. ORA-29277:invalid SMTP operation

    ORA-29277:invalid SMTP operation 邮件发送的时候出现报错 ORA-29277:invalid SMTP operation 官方解释就很简单 但是实际上重试是不行的,几 ...

  10. 一道SQL面试题

    表结构如下 是一张递归格式的表 使用SQL转换成如下格式 SQL实现 使用SQL转换成上图的格式 SQL代码: WITH T_Recur AS ( SELECT Id,1 num, cast(name ...