程序简介

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

码云项目链接: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嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器

    上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型.对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第 ...

  2. 战码先锋直播预告丨参与ArkUI,共建OpenHarmony繁荣生态

    OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」,旨在鼓励开发者参与OpenHarmony开 ...

  3. SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析

    SQL RIGHT JOIN关键字 SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录.如果没有匹配,则左侧的结果为0条记录. RIGHT JO ...

  4. C# Dev GridControl小结

    1. 如何解决单击记录整行选中的问题 View->OptionsBehavior->EditorShowMode 设置为:Click 2. 如何新增一条记录 (1).gridView.Ad ...

  5. Git 12 IDEA上传本地项目到远程

    这里以上传 Spring 开源项目到 Gitee 为例: 1.点击 Create Git Repository 2.选择项目目录 3.添加到缓存库 4.提交到本地库 5.复制远程库地址 6.推送到远程 ...

  6. OpenStack全网最全部署教程

    简单介绍 简单点来说就是一个云,一个属于自己的云平台,openstack的原版是亚马逊云,可以说openstack就是Rackspace和NASA的抄袭产物. 官方点说一个云平台管理的项目,它不是一个 ...

  7. Java入门01:环境安装与配置

    Java入门01:环境安装与配置 JDK下载 下载地址:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads ...

  8. MySQL—MySQL架构

    MySQL-MySQL架构 MySQL逻辑架构图如下: Connectors连接器:负责跟客户端建立连接: Management Serveices & Utilities系统管理和控制工具: ...

  9. 使用pycuda替换字符串,使用cuda替换字符串

    写一个python的cuda程序,实现字符串列表的字符串替换,把所有的123替换成xinyuuliu 以下是一个简单的 Python CUDA 代码示例,用于实现字符串列表的字符串替换.它使用了 NV ...

  10. PS(Photoshop CC2019)安装教程

    记录一下自己安装PS2019版本的安装过程~ 先获取安装资料: 百度网盘链接: 链接:https://pan.baidu.com/s/15tzmq-6JQCdVn378ZFqXJA?pwd=997y  ...