11061176王洛书
我的项目总结分为估计用时、实际用时、大致思路、debug和性能优化、测试用例、感想六大块。
一、项目开始之前估计用时
阅读题目 1小时
复习C++ 4小时
思考解题方法 1小时
写代码3小时
DEBUG 3小时
性能优化 2小时
总结 1-2小时
共15-16个小时
二、实际用时
阅读题目 1个小时
折腾VS2012 好久
看C++相关内容 2小时
思考解题方法+写代码 6小时
DEBUG 6小时+5小时=11小时
性能优化 5小时
总结 2小时
共27个小时
总体来说debug速度慢的原因还是对C++语法不熟悉,平时用的较少,这次个人项目算是恶补一些知识。
三、我的思路
1、从指定文件夹里读取所有.txt、.cs、.cpp、.h的文件的绝对路径,放在list.txt里。使用system((dir XXX /b /s > list.txt).c_str())的原理。
2、用Wcounter批量处理list.txt里的文件,统计词频
3、关于Wcouter的原理。。打开一个文件,进行分词(分词标志是所有非数字非字母的东西……)
确定是不是单词;是,则记录进字典;不是则抛弃。
要注意扩展模式和普通模式的区别。
4、处理完所有文件后,用sort将单词排序后输出。
5、开始debug
四、debug和代码优化
4.1我的最初始版本
(第一次因为时间紧迫测试用例只用了小文件。。当时自己电脑VS2012还未下载成功,所以在同学电脑里测试。。她的VS是中文版的)
这是我的最初始版本,有几个漏洞。
4.2中间版本
在这个版本里,我就初始版本进行了一些改进。
在第一次交作业的时候,我没有看清楚题目要求,漏考虑了目录可以是递归的情况,使用了DIR /B/AA来遍历所有文件。
第二次,我使用了DIR /b/s,直接可以遍历目标文件夹下所有的文件。
这个版本也让我发现了我的一个Bug,我的小程序在使用小文件测试程序无误后,我又使用了同学间广为流传的21M测试文件进行程序性能测试,却意外发现程序的运行有问题。
下面是这个版本的性能测试图。。
4.3终结版
在中间版的基础上经历了大概数个小时的痛苦debug之后,发现我处理list.txt里面的所有txt、cs、cpp、h文件名上有问题。
在读取文件名打开对应文件时,我使用了fin>>lines,逐词读取。
这种读取方式有个弊端,当文件名里有空格时,便不能正确读取,会被系统误认为分词。
我改了一行代码,改用getline(fin,lines)读取文件名,bug迎刃而解。
release模式下跑同学间流行的某21M测试文档的性能测试图。大家release模式下测试该文档的用时在几秒-20分钟不等,我的时间大概在5s-12s之间,可见我的程序总体效率还算比较高。
特别要注意的是
在文件读取上还有陷阱……
在发邮件问过罗老师之后,罗老师说要求程序能够处理command arguments是类似C: est和C: est的情况。因为我用system读取文件,我在最后的文件读入的时候又加入了一个判断。
int len=strlen(argv[argc - 1]);
if(argv[argc-1][len-1]!= ' \ ' )
s=s+"\";
五、测试例子
1、普通的文件
2、文件递归测试
3、windows2007,windows98,Windows之类的
4、asd,321aaafd,fga31等不合法的
5、多种文件格式的
6、空文件夹
7、空文件
8、带中文内容的
9、带中文路径的
10、文件名里有空格的
11、特别大的文件,测试性能(同学给的21M和132M的文件)
12、同学的测试文件
六、收获和感想
用了很长时间完成这次作业,确实提高了自己对C++,尤其是文件处理方面的一些理解。
也在Debug中收获了很多痛苦和知识,增强了自己对DEBUG的信心。
最后,非常感谢这次个人项目进行中帮助我的同学和老师。