程序简介

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

码云项目链接: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. HarmonyOS—使用Web组件加载页面

      页面加载是Web组件的基本功能.根据页面加载数据来源可以分为三种常用场景,包括加载网络页面.加载本地页面.加载HTML格式的富文本数据. 页面加载过程中,若涉及网络资源获取,需要配置ohos.pe ...

  2. C 语言宏 + 内联汇编实现 MIPS 系统调用

    目录 内联汇编 宏函数 宏定义 Syscall 内联汇编 编译测试 笔者最近作业要求练习 MIPS 汇编,熟悉 MIPS 汇编代码与 C 语言代码的对应关系.然而 SPIM/MARS 仿真器不能链接共 ...

  3. ES6~ES9

    ES6 1. let 1.1 let 变量声明及声明特性 let 用来声明变量,具有以下特性: 一.相较于 var ,let 变量不能重复声明 let a = 'a'; let a = 'a'; // ...

  4. mongodb基础整理篇————设计[四]

    前言 简单整理一下mongodb的设计. 正文 设计三步曲: 第一步:建立基础文档模型 例子: 1对1建模: 1 对多建模: N对N模型: 第二步: 根据读写况细化 遇到的问题: 解决: 查询连表: ...

  5. 刪除k个数字后的最小值

    前言 比如说 1593212,去掉一个数字后,保留的是最小值. 原理:因为要保留最小值,那么要删除最高位的数字是最明显的. 那么1和5到底删除哪一个呢?当然是删除最大值了. 代码 public sta ...

  6. State 和 Props的理解以及区别

    一.state 一个组件的显示形态可以由数据状态和外部参数所决定,而数据状态就是state,一般在 constructor 中初始化 当需要修改里面的值的状态需要通过调用setState来改变,从而达 ...

  7. 《c#高级编程》第2章C#2.0中的更改(二)——匿名类型

    一.概念 C#中的匿名类型是一种特殊类型,可以在运行时动态创建一个对象,该对象可以包含多个属性,这些属性的名称和类型可以在创建时指定.相对于定义具体的类,匿名类型更加灵活和简洁. C#的匿名类型通常用 ...

  8. 【笔记】Oracle union all&for update锁

    [笔记]Oracle union all&for update union all 在Oracle中有三种类型的集合操作 UNION:求并,重复记录只显示一次 UNION ALL:求并集,显示 ...

  9. 第3章 python 爬虫抓包与数据解析

    第 3章 Python 爬虫抓包与数据解析 3.1 抓包进阶 目前,我们已经会使用 Chrome 浏览器自带的开发者工具来抓取访问网页的数据包,但是这种抓包方法有局限性,比如只能监听一个浏览器选项卡, ...

  10. KubeVela 1.1 发布,开启混合环境应用交付新里程碑

    ​简介: KubeVela 作为一个开箱即用.面向现代微服务架构的应用交付与管理平台,今天正式发布了 1.1 版本,以更加用户友好和完善的功能集,开启了"让混合环境应用交付更加简单高效&qu ...