WordCount-第三次作业

 

一、开头

码云链接:https://gitee.com/coNgY1/projects

(1)合作者:201631062122,201631062321

二、正文

(1)、制定编码规范

  • 变量命名必须有意义,做到见名知用途
  • 所有的类型/类/函数名都用Pascal形式,所有的变量都用Camel形式
  • 注释应简洁清晰地描述代码用途
  • 一个变量仅用一行语句声明
  • {和}单独占一行

(2)、代码自审并修正
经过代码自审发现了以下问题

最开始没有判断-s参数,导致输入数据时候没有输出所有的文件

最开始没有判断参数的个数,导致错误

 

代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<algorithm>
#include<vector>
#include<io.h>
using namespace std;

class CFileRecord
{
private:
	int m_Wordnum;
	int m_Charnum;
	int m_Linenum;
	int m_Codeline;
	int m_Spaceline;
	int m_Noteline;
	string m_record;
	const string OUT_FILE = "result.txt";
	ifstream input;
	ofstream out;

private:
	bool IsStopword(string szWord);

public:
	string m_szFile;
	vector<string> m_mode;
	vector<string> m_Stopword;

public:
	CFileRecord();
	~CFileRecord()
	{
		if (input.is_open())
			input.close();
		if (out.is_open())
		{
			out << m_record;
			out.close();
		}
	};
	inline int GetCharnum() { return m_Charnum; }
	inline int GetLinenum() { return m_Linenum; }
	inline int GetWordnum() { return m_Wordnum; }
	void GetStopword(string szStopFile);
	inline string GetHang() { 
		char szFormat[0x20] = {0};
		sprintf(szFormat, "%d//%d//%d",m_Codeline,m_Spaceline,m_Noteline);
		return szFormat;
	}
	void OutRecord(string szFile)
	{
		ofstream out(szFile, ostream::ate);
		if (out.is_open())
		{
			for (auto iter = m_mode.begin(); iter != m_mode.end(); iter++)
			{
				if (*iter == "-c")
					out << "字符数 : " + to_string(m_Charnum) + "\r\n";
				else if (*iter == "-l")
					out << "行数 : " + to_string(m_Linenum) + "\r\n";
				else if (*iter == "-w")
					out << "单词数 : " + to_string(m_Wordnum) + "\r\n";
				else if(*iter == "-a")
					out << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
			}
			out.close();
		}
	}
	void OpenFile(string szFile);
	void UpdateData();
	void PrintData();
};

vector<string> GetAllfile();

int main(int argc, char **argv)
{
	string szInfile;
	string mode;

	if (argc % 2 == 0)
	{
		//cout << "wrong param!" << endl;;
		return 1;
	}

	{
		szInfile = argv[2];
		CFileRecord CRecord;

		for (int i = 1; i < argc; i ++)
		{
			mode = argv[i];
			if (mode.find(".") != -1)
				CRecord.m_szFile = mode;
			else
			{
				CRecord.m_mode.push_back(mode);
				if (mode == "-e")
					CRecord.GetStopword(argv[++i]);

			}
		}	
		CRecord.PrintData();
	}

	getchar();

	return 0;
}

bool CFileRecord::IsStopword(string szWord)
{
	for (auto word : m_Stopword)
	{
		if (word == szWord)
			return true;
	}
	return false;
}

CFileRecord::CFileRecord() :m_Wordnum(0), m_Charnum(0), m_Linenum(0), out(OUT_FILE)
{
}

void CFileRecord::GetStopword(string szStopFile)
{
	ifstream iFile(szStopFile);
	string word,szLine;
	while (getline(iFile, szLine))
	{
		istringstream iss(szLine);
		while (iss >> word)
		{
			m_Stopword.push_back(word);
		}
	}
}

void CFileRecord::OpenFile(string szFile)
{
	if(input.is_open())
		input.close();
	input.open(szFile);
	m_szFile = szFile;
}

void CFileRecord::UpdateData()
{
	m_Linenum = 0;
	m_Wordnum = 0;
	m_Charnum = 0;
	m_Codeline = 0;
	m_Spaceline = 0;
	m_Noteline = 0;
	if (input.is_open())
	{
		string szLine;
		while (getline(input, szLine))
		{
			m_Linenum++;
			m_Charnum += szLine.size();
			istringstream record(szLine);
			if (szLine.find_first_of("////") == 0 || szLine.find_first_of("}//") == 0)
				m_Noteline++;
			else if (szLine.empty())
				m_Spaceline++;
			else
				m_Codeline++;

			string word;
			if (find(m_mode.begin(), m_mode.end(), "-e") != m_mode.end())
			{
				while (record >> word)
				{
					if (IsStopword(word))
						continue;
					m_Wordnum += count(begin(word), end(word), ',') + 1;
				}
			}
			else
			{
				while (record >> word)
				{
					m_Wordnum += count(begin(word), end(word), ',') + 1;
				}
			}
		}
	}

	m_record += m_szFile + ",字符数 : " + to_string(m_Charnum) + "\r\n"
		+ m_szFile + ",单词数 : " + to_string(m_Wordnum) + "\r\n"
		+ m_szFile + ",行数 : " + to_string(m_Linenum) + "\r\n"
		+ m_szFile + ",代码行/空行/注释行" + GetHang() + "\r\n"
		;
}

void CFileRecord::PrintData()
{
	if (find(m_mode.begin(), m_mode.end(), "-s") != m_mode.end())
	{
		vector<string> vecFile = GetAllfile();
		for (auto iter = vecFile.begin(); iter != vecFile.end(); iter++)
		{
			OpenFile(*iter);
			UpdateData();
			if (find(m_mode.begin(), m_mode.end(), "-c") != m_mode.end())
				cout << m_szFile << ",字符数: " << GetCharnum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-l") != m_mode.end())
				cout << m_szFile << ",行数: " << GetLinenum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-w") != m_mode.end())
				cout << m_szFile << ",单词数: " << GetWordnum() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-a") != m_mode.end())
				cout << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
			if (find(m_mode.begin(), m_mode.end(), "-o") != m_mode.end())
				OutRecord(m_szFile);
		}
	}
	else
	{
		OpenFile(m_szFile);
		UpdateData();
		if (find(m_mode.begin(), m_mode.end(), "-c") != m_mode.end())
			cout << m_szFile << ",字符数: " << GetCharnum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-l") != m_mode.end())
			cout << m_szFile << ",行数: " << GetLinenum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-w") != m_mode.end())
			cout << m_szFile << ",单词数: " << GetWordnum() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-a") != m_mode.end())
			cout << m_szFile << ",代码行/空行/注释行" << GetHang() << endl;
		if (find(m_mode.begin(), m_mode.end(), "-o") != m_mode.end())
			OutRecord(m_szFile);
	}
}

vector<string> GetAllfile()
{
	vector<string> vecstr;
	_finddata_t sFind;
	long result = 0;
	result = _findfirst("*.txt", &sFind);
	if (result == -1)
		return vecstr;
	do
	{
		vecstr.push_back(sFind.name);
	} while (_findnext(result, &sFind) != -1);
	return vecstr;
}

  (4)、静态代码审查 本次审查使用工具VS的扩展工具StyleCop,未检查出问题

  (5)、性能测试和优化 本项目采用的性能测试工具:JProfilerJProfiler直觉式的GUI可以找到性能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。 它让程序员对heap walker作资源回收器的root analysis,可以轻易找出内存漏失。通过性能测试,我们找出了一些内存消耗的代码并对其进行了优化,提升了代码执行性能。

posted @ 2018-10-21 21:15  Vm4  阅读(169)  评论(0编辑  收藏  举报