Github项目地址

wc-project

PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 40 35
· Estimate · 估计这个任务需要多少时间 90 120
Development 开发
· Analysis · 需求分析 (包括学习新技术) 100 140
· Design Spec · 生成设计文档 120 90
· Design Review · 设计复审 (和同事审核设计文档) 60 50
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 25
· Design · 具体设计 20 55
· Coding · 具体编码 300 450
· Code Review · 代码复审 40 60
· Test · 测试(自我测试,修改代码,提交修改) 60 100
Reporting 报告
· Test Report · 测试报告 120 150
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 10
合计 1040 1295

解题思路

项目工作被分成三个层次:基本、扩展、高级。

应该由最底层的单文件处理出发,延伸到多文件的处理。

由各项的功能如何定义和实现出发,来充实我们的程序。

  1. -c 统计文件中的字符数

    以程序的眼光看待,任何字符(除了‘\r’),均算是一个字符。

    基于这样的定义,对目标文件的每读入一个字符,若其不是‘\r’,均增加统计的字符数。
  2. -w 统计文件中的词的数量

    词的定义多种多样,这里的定义采用一系列连续的字母或数字或下划线,为一个词;或者对于中文来说,一个字即为一个词。

    基于这样的定义,我们可以把所有键盘上打出的符号视作一个栏杆,栏杆两边的有字符数部分视作是两个独立的词,以此来统计词的数量。
  3. -l 统计文件中共有几行

    行数的判定十分明朗,当程序每读到一个‘\n’时,或文件读完毕时(但是文件有内容时),视作一个换行,如此来统计行数。
  4. -s 递归处理目录下符合条件的文件

    C++的文件处理十分麻烦,我在此处卡了许久。需要利用封装度较低的库函数来实现对文件夹的便利和通配符的支持,还有中文的支持。由此使用了io.hdirect.hwindows.hgetopt,这四个库文件。通过自己手写封装函数来实现自己的需求。
  5. 返回更复杂的数据(代码行 / 空行 / 注释行)。

    相较于上一个而言,这个较为简单和明确:
  • 空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。
  • 代码行:本行包括多于一个字符的代码。
  • 注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

    } //注释

    在这种情况下,这一行属于注释行。

设计实现过程

程序设计主要分三个部分,主要逻辑围绕着main展开。

程序包含两个类,其中一个负责全流程的读入解析和输出,另外一个工具类作为中文支持存在,提供字符转换。

工具类 WStringTool中包含有

  • string GbkToUtf8(const std::string& strGbk);
  • string Utf8ToGbk(const std::string& strUtf8);
  • wstring UTF8ToUnicode(const char* str);
  • char *UnicodeToUTF8(const wchar_t* str);
  • wstring GbkToUnicode(const char* strGbk);
  • string UnicodeToGbk (const std::wstring& strUnicode);

六种方法,这里只使用了GbkToUnicode和UTF8ToUnicode这两个方法。

在main()中使用库文件getopt来获取命令行下每一个参数存在性。

  1. while(true)
  2. {
  3. int c = getopt(argc, argv, par);
  4. if(c == -1)
  5. break;
  6. switch (c) {
  7. case 'c':Work::calcChar = true;
  8. break;
  9. case 'w':Work::calcWord = true;
  10. break;
  11. case 'l':Work::calcLine = true;
  12. break;
  13. case 's':recursive = true;
  14. break;
  15. case 'a':Work::detail = true;
  16. break;
  17. case 1: //读入到文件参数
  18. match.push_back(optarg);
  19. default:
  20. break;
  21. }
  22. }

这里的case 1会对每一个文件都进行压入,可以通过此点来拓展出进行处理多文件的能力。

work.cpp中读入文件的操作,权衡了易用性和高效性。

  1. bool Work::readFile(const wchar_t* fileName)
  2. {
  3. ifstream fin;
  4. fin.open(fileName, ios::binary);
  5. if(fin.is_open() == false)
  6. return false;
  7. fin.seekg(0, ios::end);
  8. int len = static_cast<int>(fin.tellg()) + 1;
  9. fin.seekg(0, ios::beg);
  10. delete res;
  11. init();
  12. res = new char[len];
  13. fin.read(res, len);
  14. res[len-1] = '\0'; // before is 0xCD
  15. this->fileName = wstring(fileName);
  16. return true;
  17. }

关于每一行代码的检测函数,集成度较高,解耦难度高,请到我项目地址去查看。

测试运行

运行参数:wc.exe helloworld.txt -c -w -l

运行结果:

  1. ...\helloworld.txt
  2. The number of char is 104
  3. The number of word is 15
  4. The number of line is 8

运行参数:wc.exe *.txt -c -w -l

运行结果:

  1. ...\helloworld.txt
  2. The number of char is 104
  3. The number of word is 15
  4. The number of line is 8
  5. ...\x.txt
  6. The number of char is 5
  7. The number of word is 2
  8. The number of line is 1

运行参数:wc.exe *.txt -s -a

运行结果:

  1. ...\helloworld.txt
  2. The number of blank-line is 0
  3. The number of code-line is 7
  4. The number of annotation-line is 1
  5. ...\x.txt
  6. The number of blank-line is 0
  7. The number of code-line is 1
  8. The number of annotation-line is 0
  9. ...\kkkk\ssss.txt
  10. The number of blank-line is 0
  11. The number of code-line is 7
  12. The number of annotation-line is 0
  13. ...\kkkk\x.txt
  14. The number of blank-line is 0
  15. The number of code-line is 7
  16. The number of annotation-line is 0
  17. ...\ssss\ssss.txt
  18. The number of blank-line is 0
  19. The number of code-line is 7
  20. The number of annotation-line is 0
  21. ...\ssss\x.txt
  22. The number of blank-line is 0
  23. The number of code-line is 7
  24. The number of annotation-line is 0
  25. ...\kkkk\ssss\ssss.txt
  26. The number of blank-line is 0
  27. The number of code-line is 7
  28. The number of annotation-line is 0
  29. ...\kkkk\ssss\x.txt
  30. The number of blank-line is 0
  31. The number of code-line is 7
  32. The number of annotation-line is 0

程序运行的截图:

之前提及到的处理多文件的能力的拓展

项目小结

这是我个人第一次在编程中使用软件工程的思想,在实践过程中,我发现理论和实践的结合需要多次操作,才能更好的融会贯通,使得理论指导实践,成就一项良好的工程。

项目开始时选定的C++,低估了其掌握的难度,尤其是在文件的遍历和文件编码中踩坑甚多,让我看到了我在语言掌握上的不足,期待今后更加努力。

软件工程的PSP表,第一次使用,对于自己每项任务完成时间的估计没有经验参考,随着直觉估量,导致偏差过大,工程完成预期时间严重拖后,需要进行进一步的学习。

wc.exe C++实现的更多相关文章

  1. WC.exe【C】

    gitee传送门!!!(电脑打不开github,多次尝试未果,决定先用gitee存着先) 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序 ...

  2. 小白のjava实现wc.exe功能

    GitHub地址 项目完成情况 基本功能列表(已实现) wc.exe -c file.c     //返回文件 file.c 的字符数 wc.exe -w file.c    //返回文件 file. ...

  3. 模仿WC.exe的功能实现--node.js

    Github项目地址:https://github.com/102derLinmenmin/myWc WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要 ...

  4. wc.exe

    1 /* 2 * 没能实现的功能:wc.exe -s递归处理目录下符合条件的文件 3 * wc.exe -x 显示图形界面 4 * 5 * 6 * 实现的功能: wc.exe -c显示文件的字符数. ...

  5. 软工作业1—java实现wc.exe

    github项目地址 https://github.com/liyizhu/wc.exe WC 项目要求 基本功能列表: wc.exe -c file.c     //返回文件 file.c 的字符数 ...

  6. 用c语言基本实现wc.exe功能

    网址:https://github.com/3216005214/wc.exe wc项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿 ...

  7. java实现wc.exe

    Github地址:https://github.com/ztz1998/wc/tree/master 项目相关要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功 ...

  8. (第三周)wc.exe—命令行实现对指定目录下文件的操作

    一.用户需求 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c ...

  9. 软工作业No.1。Java实现WC.exe

    网址:https://github.com/a249970271/WC WC 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命令行程序,模仿已有w ...

  10. 软件工程 wc.exe 代码统计作业

    软件工程 wc.exe 代码统计作业分享 1. Github 项目地址 https://github.com/EdwardLiu-Aurora/WordCount 更好地阅读本文,可点击这里 基本要求 ...

随机推荐

  1. bootstrapSwitch 使用

    1.bootstrapSwitch 默认选项,加上checked表示true,不加表示false <input type="checkbox" id="" ...

  2. 【转】Jmeter性能测试报告解析

    Jmeter报告解析 1.Aggregate Report 解析 Aggregate Report 是 JMeter 常用的一个 Listener,中文被翻译为“聚合报告”.今天再次有同行问到这个报告 ...

  3. FTP文件传输协议两种模式 ftp协议集,错误码集,ftp客户端命令集

    TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20.FTP协议的任务是从一台计算机将文件传送到另一台计算机,它与这两台计算机所处的位置.联接的方式.甚至是是否使用相同的操 ...

  4. 接口规范,js处理json,php返回给ajax的数据格式

    ajax异步获取php数据. 一般php会在后台处理请求,并返回结果给前端. 必须是echo的方式,不然ajax获取不到. 返回的类型包括,字符串,数字,json. 最常用的就是json. 返回后,前 ...

  5. Linux学习笔记 -- 磁盘的管理

    df df命令参数功能:检查文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 语法: df [-ahikHTm] [目录或文件名] 选项与参数: -a ...

  6. adb正常,手机启动usb调试,adb devices下没有改设备

    手机开启开发者模式,adb正常时adb devices下没有设备: 1.进入设备管理器--查找adb的硬件id

  7. windows提权辅助工具koadic

    项目地址:https://github.com/zerosum0x0/koadic ┌─[root@sch01ar]─[/sch01ar] └──╼ #git clone https://github ...

  8. python's twenty-first day for me 抽象类和接口类以及多态

    归一化设计: 不管是哪一个类的对象,都调用同一个函数去完成相似的功能. class Alipay: def pay(self,money): print('使用支付宝支付了%s' % money) c ...

  9. sourceTree免密码校验

    1.ssh请求:参考:http://www.ithao123.cn/content-1584888.html 步骤1:检查你的电脑上是否已经生成了SSH Key 在git bash下执行如下命令 cd ...

  10. 1.4 Application应用

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app.app应用是我们使用celery所有功能的入口,比如创建任务,管 ...