gitee:https://gitee.com/coNgY1/word-count/
1.功能分析
WordCount的需求可以概括为:对程序设计语言源文件统计字符数、单词数、行数,统计结果以指定格式输出到默认文件中,以及其他扩展功能,并能够快速地处理多个文件。可执行程序命名为:wc.exe,该程序处理用户需求的模式为:
wc.exe [parameter] [input_file_name]
2.思路
C++来写,一个CFileRecord类来统计。
3.代码:
#include<iostream>
#include<fstream>
#include<string>
#include<sstream>
#include<algorithm>
#include<vector>
using namespace std;
class CFileRecord
{
private:
int m_Wordnum;
int m_Charnum;
int m_Linenum;
string m_record;
const string OUT_FILE = "result.txt";
ifstream input;
ofstream out;
public:
vector<string> m_mode;
public:
CFileRecord(string szFile) :m_Wordnum(0), m_Charnum(0), m_Linenum(0), input(szFile), out(OUT_FILE){
if (input.is_open() && out.is_open())
{
string szLine;
while (getline(input, szLine))
{
m_Linenum++;
m_Charnum += szLine.size();
istringstream record(szLine);
string word;
while (record >> word)
{
m_Wordnum += count(begin(word), end(word), ',') + 1;
}
}
}
m_record = "字符数 : " + to_string(m_Charnum) + "\r\n"
+"单词数 : " + to_string(m_Wordnum) + "\r\n"
+"行数 : " + to_string(m_Linenum) + "\r\n";
out << m_record;
}
~CFileRecord()
{
if(input.is_open())
input.close();
if(out.is_open())
out.close();
};
int GetCharnum() { return m_Charnum; }
int GetLinenum() { return m_Linenum; }
int GetWordnum() { return m_Wordnum; }
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";
}
out.close();
}
}
};
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(szInfile);
for (int i = 1; i < argc; i += 2)
{
mode = argv[i];
szInfile = argv[i+1];
CRecord.m_mode.push_back(mode);
if (mode == "-c")
cout << szInfile << ",字符数: " << CRecord.GetCharnum() << endl;
else if (mode == "-l")
cout << szInfile << ",行数: " << CRecord.GetLinenum() << endl;
else if (mode == "-w")
cout << szInfile << ",单词数: " << CRecord.GetWordnum() << endl;
else if (mode == "-o")
CRecord.OutRecord(szInfile);
}
return 0;
}
四.测试