项目源码地址:https://gitee.com/xjtsh/projects

功能实现:

wc.exe -c file.c     //返回文件 file.c 的字符数

wc.exe -w file.c     //返回文件 file.c 的单词总数

wc.exe -l file.c     //返回文件 file.c 的总行数

wc.exe -o outputFile.txt     //将结果输出到指定文件outputFile.txt

项目简介

本项目的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。

可执行程序命名为:wc.exe,该程序处理用户需求的模式为:

wc.exe [parameter] [input_file_name]

存储统计结果的文件默认为result.txt,放在与wc.exe相同的目录下。

我采用的是Java语言实现。这个项目看似功能比较简单,实则工作量巨大,原因有三:一、对细节的要求比较高,从基本功能实现形式,小到命令输入的格式,都有比较严格的要求,必须按照要求来执行的话需要增加一定的工作耗时;需求分析、测试用例、博客撰写,所以整个项目开发的过程不单单只是考虑如何去实现功能这一件事情了,这也导致了所花费的时间增多;自身编程水平的限制,整个项目的流程要求非常规范,所以一步一步来执行的话需要连续的时间,然而当前课程任务并不轻松加上这几天正好又是另一门课程的课程设计上交截止时间,故而只能在零零碎碎的时间之中去完成项目设计和编码实现,在一定程度上降低了效率.但是最麻烦是.jar转.exe文件实在消耗了我大量的时间,网上博客众说纷纭,自己尝试的时候出现各种不理解的bug,不理解软件的运行过程对于我改进转换过程造成了极大的困难,好在,最终解决了问题。先这样吧,以后再汲取经验和教训,慢慢学习改进。

解题思路:

获取键盘数输入的指令,当读取到 '-'这个命令符号前缀时 ,我们能知道它将会和下一个字符一起构成一个操作指令,于是我们通过对下一个字符的读取就能够决定这个命令符号具体代表了什么含义。这里分几种情况:若下一个字符是 'c'、 'w'、'l'之类的基本功能参数,若下一个字符是 'o'、'e'之类的拓展功能参数,那么它会紧跟着一个txt文件,实现的是对文件内容停用词检索与执行结果输出到文件的操作功能;也存在下一个字符是程序未定义的参数字符如‘m’、'n'等,这时程序应当是无法识别这类命令参数的,不会执行任何操作,但一般也不会报错。获取待处理文件名和结果输出文件名,通过指令中是否含有-o指令判断是否采用默认的result.txt文件输出。以及获得输出文件名。本项目仅实现了文件的字符数、行数、单词数的统计。即分为一个主类和获取字符数、行数、单词数方、输出方法和main方法。待处理文件放在项目的统一文件夹内。

上述的部分代码展示如下:

在编译时输入指令,所以指令被储存在args[]数组中,区分默认的储存文件和用户自定义文件。统计指令中的.txt指令数,然后经过if判断获得待处理文件名

统计文件字符数时,对字符进行判断,如果读取的某一个字符为/,并且下一个字符也为/时,则后面的字符均为注释,否则继续自增

统计非正确单词数时,仅以一个或者空格或逗号作为分隔符。

统计包括空行在内的文件行数:

将统计内容输出到文件

测试设计

对于程序测试这一块,我一共设计了10个测试用例,其中包括8个相互独立的常规测试用例和2种类型的错误测试用例。具体测试如下:

1. 基本字符测试

输入:–c test.txt

期望输出:字符数:148

实际输出:字符数:148

分析:符合预期输出

2. 行数字符测试

输入:-l test.txt

期望输出:,文件总行数:7

实际输出:文件总行数:7

分析:符合预期输入

3. 单词测试

输入:-w test.txt

期望输出:,文件总行数:20

实际输出:文件总行数:20

分析:符合预期输入

4. 基本功能测试

输入:-c -w -l test.txt

期望输出:字符个数:148

       单词个数:20

       文件总行数:7

实际输出:字符个数:148

     单词个数:20

     文件总行数:7

分析:符合预期输出

5. 部分扩展功能测试

输入:-c test.txt stoplist.txt -o output.txt

期望输出:字符数:143

实际输出:字符数:143

分析:符合预期输出

6. 错误指令测试一(纯未定义命令参数)

输入:-m test.txt

期望输出:无期望

实际输出:无任何内容,但也未报错

分析:由于并未涉及命令参数-m,故而程序无法识别对应指令无法执行。

7. 错误指令测试二(含未定义命令参数)

输入:-c -m test.txt

期望输出:无期望

实际输出:字符个数:148

分析:由于命令语句中含有已定义的命令参数-c,故而虽然含有-m,但是程序依然识别了-c并且执行了字符统计功能。

以上除-|指令以外均在dos界面测试,-|指令在dos界面未知错误,无任何输出,但是在IDEA中输出没有任何问题。希望在接下来的时间内会发现错误所在。

项目总结

总的说来,这次项目确实让我收获了不少东西,一开始因为要求的细节过于繁琐而且时常所以有些情绪化,在项目设计和开发的过程中没有完全静下心来去好好地想一下如何解决这个问题。随着提交时间的逼近才逐渐硬着头皮开始认真去搞这个作业,从最终的结果来看,确实学到了很多有用的东西,关于注释行、代码行与空行的正则表达式匹配判定法以及如何从提高一个程序的条件覆盖率去编写测试用例测试程序的性能,这些都是以后走向工作岗位很宝贵、很重要的东西。不过由于时间的仓促,我编写的程序仍存在着很多不尽如人意的地方,相关的测试用例的设计也有一定的缺憾和漏洞,这些都是我在今后学习中要去学习改进的地方。

文件内容统计:对任意给定的.txt文件进行内容的字符数、行数、单词数进行统计的更多相关文章

  1. 2.获取指定目录及子目录下所有txt文件的个数,并将这些txt文件复制到F盘下任意目录

    package cn.it.text; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import ...

  2. python操作txt文件中数据教程[4]-python去掉txt文件行尾换行

    python操作txt文件中数据教程[4]-python去掉txt文件行尾换行 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文章 python操作txt文件中数据教程[1]-使用pyt ...

  3. C# 读取大文件 (可以读取3GB大小的txt文件)

    原文:C# 读取大文件 (可以读取3GB大小的txt文件) 在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件. 如果你只是 ...

  4. 用脚本如何实现将Linux下的txt文件批量转化为Windows下的txt文件?

    众所周知,Windows和Linux的文件换行回车格式不同,Windows下换行格式是\r\n(回车+换行),Linux下换行格式为\n(只是换行),因此,其中一个操作系统的文本文件若需要在另外一个中 ...

  5. python操作txt文件中数据教程[2]-python提取txt文件

    python操作txt文件中数据教程[2]-python提取txt文件中的行列元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 原始txt文件 程序实现后结果-将txt中元素提取并保存在c ...

  6. OpenCV C++ 计算文件夹中对象文件数目及批量处理后保存到txt文件

    //采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...

  7. OpenCV2类批量处理文件夹及文件图像 及批量处理后保存到txt文件

    //采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...

  8. Windows/Ubuntu下,将所有文件名字列举出来并保存到txt文件中

    Windows下 使用如下的DOS命令来实现: dir /s /b > lists.txt 可以将当前路径下的所有文件的"文件路径+文件名"存储在lists.txt中. 其中 ...

  9. 复制D:\\day05目录下的所有文件到D:\\copy,并将.txt文件改为.java文件。

    **解题思路: 1.首先定义一个静态的refile方法,参数传入两个文件路径 2.要复制目录下的所有文件,首先查询File类的方法,可以使用listFiles方法得到目录下的文件 3.想到这问题基本就 ...

随机推荐

  1. MyBatis(五):mybatis关联映射

    Mybatis中表与表之间的关系分为一下4类: 1)一对一 2)一对多 3)多对一 4)多对多 创建数据Demo表 数据库表: 用户表user:记录了购买商品的用户信息. 订单表orders:记录了用 ...

  2. mac双系统下ubuntu卡在开机密码登录界面卡死

    背景:开机黑屏卡在,dev/sda1: clean, 552599/6111232 files, 7119295/24414464 blocks,修复完这个问题之后,出现桌面卡死,光标鼠标键盘全部失灵 ...

  3. Substr与mb_substr区别

      <?php $str = substr('helloword',3,4);//从下标3开始截取截取4个字符 $str = substr('helloword',3);//从截取掉前三个字符 ...

  4. 分析轮子(四)- 我也玩一把 Serializable.java

    前言:在写 分析轮子(一)-ArrayList.java 的时候曾经下过一个结论 “实现Serializable接口,表示ArrayList是可序列化的”,这个结论是以往学习的经验所得,并且平时在编程 ...

  5. Python 简单入门指北(一)

    Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...

  6. Paxos 实现日志复制同步(Basic Paxos)

    Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...

  7. Android gradle 配置

    gradle https://www.cnblogs.com/qianxudetianxia/p/4948499.html flavor https://blog.csdn.net/user11223 ...

  8. Flutter & Dart 安装在window系统

    一.系统环境 flutter最低要求 1,windows7 SP1 64位版本以上,我的系统就是windows 7 sp1 64bit 2,git for windows ,没有安装的需要到这里下载  ...

  9. SpringBoot------自定义拦截器

    1.添加pom.xml使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="htt ...

  10. 【Excel】输出固定长文本

    '******************************************************************************* ' 固定長形式テキストファイル書き出す ...