一、开头
码云链接: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,可以轻易找出内存漏失。通过性能测试,我们找出了一些内存消耗的代码并对其进行了优化,提升了代码执行性能。