WordCount

Posted 彩民

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WordCount相关的知识,希望对你有一定的参考价值。

一.Githubhttps://github.com/JiejieCM/WordCount

二.psp表格

因为做的时间比较零散,大多是估计,所以表格可能不太准确。

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

 30

 30

· Estimate

· 估计这个任务需要多少时间

1440

1920

Development

开发

1200

1200

· Analysis

· 需求分析 (包括学习新技术)

600

600

 

· Design Spec

· 生成设计文档

 0

 0

· Design Review

· 设计复审 (和同事审核设计文档)

 0

 0

· Coding Standard

· 代码规范 (为目前的开发制定合适的规范)

 0

 0

· Design

· 具体设计

 60

 60

· Coding

· 具体编码

 300

 600

· Code Review

· 代码复审

 100

 100

· Test

· 测试(自我测试,修改代码,提交修改)

 120

 240

Reporting

报告

 100

 150

· Test Report

· 测试报告

60

120 

· Size Measurement

· 计算工作量

 20

 0

· Postmortem & Process Improvement Plan

· 事后总结, 并提出过程改进计划

 20

 30

 

合计

 1300

 1650

 三.解题思路

使用c++,vs2015

拿到题目时,看到基础功能觉得自己还是可以完成的,因为想巩固基本语言c++,于是选择了使用c++进行编程。由于自己代码能力比较差,所以暂时只完成了基础功能,扩展功能写了一些但有点问题,所以没有提交。

【基础功能】

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
统计字符:这个很简单,直接用函数strlen得出。
统计行数:读入文件时,我采用getline逐行读入,循环累加数则为文件行数。
统计单词:单词的统计则稍微复杂一点,这里我设置一个变量flag,用flag对此时读入的是否是单词进行标记,从而进行计数。
[参考]:http://blog.csdn.net/henry19850318/article/details/5929023

【指令读入与分析】
读取控制台指令是我以前没有接触过的,经查阅资料发现可以直接利用main函数的argv参数。
当控制台指令为wc.exe -c test.c时,这三个参数分别对应argv[]的argv[0],argv[1],argv[2],以此类推。
扫描指令,当遇到“-”时说明此事读入的是指令,然后根据“c”“w”“l”“o”来区分其执行的不同操作,否则读入的则为文件名(输入或者输出文件),从而对文件进行操作。
此时我遇到的问题是,当只有一个命令参数如-c时,传入文件名显然是argv[2],但传入多个参数时,不一定是
argv[2],如是对参数进行遍历,当有“-”时,读入的是命令参数,此处用结构体进行标记。
不是“-”的话此时传入的即为文件名。
[参考]:http://blog.csdn.net/henry19850318/article/details/5929023

【读取文件及输出文件】
这里要用到头文件
fstream,这里我直接用了两个函数,fstream infile(filename, ios::in),读取文件名为filename的文件,ios::in表示仅对文件进行读取,将结果输出到文件中使用了函数in.open(outputfile, ios::trunc)
将内容输出到outputfile中。在对文件进行读取时,采用了逐行读取,即getline(str, 256)。
四.代码分析
设置结构体,判断指令
struct Command {
	bool _c;
	bool _w;
	bool _l;
	bool _o;
	bool _s;
	Command() {
		_c = false;
		_w = false;
		_l = false;
		_o = false;
		_s = false;
	}
};

主要统计函数

void count(fstream &outfile, int *cnt)  //统计函数  
{
	char str[256];
	int flag;
	while (outfile.getline(str, 256))
	{
		cnt[2]++;
		cnt[0] = cnt[0] + strlen(str);
		flag = 1;
		for (int i = 0; i < strlen(str); i++)
		{
			if (str[i] >= \'A\' && str[i] <= \'z\'&& flag == 1)

			{
				cnt[1]++;//统计单词数  
				flag = 0;
			}
			if (str[i] == \' \' || str[i] == \',\' || str[i] == \'\\t\' || str[i] == \'\\n\')
				flag = 1;
		}

	}

	return;
}

主函数

int main(int argc, char* argv[])
{

	int i;
	char filename[MAX_PATH_LENGTH];
	char outputfile[MAX_PATH_LENGTH] = "result.txt";
	int cnt[3] = { 0 };
	vector<string> files;
	Command command;

	for (i = 1;i < argc;i++) {
		if (argv[i][0] == \'-\')
		{
			if (argv[i][1] == \'c\')
				command._c = true;
			if (argv[i][1] == \'w\')
				command._w = true;
			if (argv[i][1] == \'l\')
				command._l = true;
			if (argv[i][1] == \'o\')
			{
				command._o = true;
				i++;
				strcpy_s(outputfile, argv[i]);
			}
			if (argv[i][1] == \'s\') {
				i++;
				command._s = true;
			}
		}
		else
			strcpy_s(filename, argv[i]);
	}
	if (command._s = true) {
		getFileName(filename, files);
		for (i = 0;i < files.size();i++)
		{
			if (strcmp(argv[i], "-c") == 0)
				cout << files[i] << "," << "字符数:" << cnt[0] << endl;
			if (strcmp(argv[i], "-w") == 0)
				cout << files[i] << "," << "单词数:" << cnt[1] << endl;
			if (strcmp(argv[i], "-l") == 0)
				cout << files[i] << "," << "行数:" << cnt[2] << endl;
			if (strcmp(argv[i], "-o") == 0)
			{
				ofstream in;//将结果输出到output文件
				in.open(outputfile, ios::trunc);
				in << "字符数:" << cnt[0] << endl;
				in << "单词数:" << cnt[1] << endl;
				in << "行数:" << cnt[2] << endl;
			}
		}
	}
	else {
		fstream infile(filename, ios::in);//打开文件用于读取
		count(infile, cnt);
		for (i = 0;i < argc; i++) {
			if (strcmp(argv[i], "-c") == 0)
				cout << filename << "," << "字符数:" << cnt[0] << endl;
			if (strcmp(argv[i], "-w") == 0)
				cout << filename << "," << "单词数:" << cnt[1] << endl;
			if (strcmp(argv[i], "-l") == 0)
				cout << filename << "," << "行数:" << cnt[2] << endl;
			if (strcmp(argv[i], "-o") == 0)
			{
				ofstream in;//将结果输出到output文件
				in.open(outputfile, ios::trunc);
				in << "字符数:" << cnt[0] << endl;
				in << "单词数:" << cnt[1] << endl;
				in << "行数:" << cnt[2] << endl;
			}
		}
		infile.close();
	}

五.测试

根据不同指令
1.wc.exe -c test.c

 

2.wc.exe -w test.c

 

3.wc.exe -l test.c

 

4.wc.exe -c -w test.c

 

5.wc.exe -c -l test.c

 

6.wc.exe -w -l test.c

 

7.wc.exe -c -w -l test.c

 8.wc.exe -o result.txt


取多个文件进行测试
9.文件test1

10.文件test2

六.参考
【1】http://blog.csdn.net/henry19850318/article/details/5929023
【2】http://blog.csdn.net/u010166404/article/details/46353263

以上是关于WordCount的主要内容,如果未能解决你的问题,请参考以下文章

hadoop之WordCount源代码分析

Hadoop中WordCount代码-直接加载hadoop的配置文件

WordCount代码实现及测试

Hadoop- Wordcount程序原理及代码实现

wordcount代码实现详解

如何运行自带wordcount-Hadoop2