以前写的一个程序,大概是考研的时候写的
当时也是一时兴起
主要功能为选取某一目录,然后对目录下所有特定扩展名的文本文件进行扫描,统计所有单词数量
最后按从多到少统计到一个txt里。
基于WTL写的
关键代码如下
int CMainFrame::WordCensus()
{
WIN32_FIND_DATA FileData;
HANDLE hSearch;
BOOL fFinished = FALSE;
TCHAR szPath[MAX_PATH];
lstrcat(m_szPathName, TEXT("\\"));
lstrcpy(szPath, m_szPathName);
lstrcat(szPath, TEXT("*.lrc"));
m_view.m_bStart = true;
//m_view.OnPaint();
lstrcpy(m_view.m_szFileName, szPath);
hSearch = FindFirstFile(szPath, &FileData);
if (hSearch == INVALID_HANDLE_VALUE)
{
::MessageBox(NULL, "Search Failed!",
"error.", MB_ICONERROR);
return -1;
}
while (!fFinished)
{
lstrcpy(szPath, m_szPathName);
lstrcat(szPath, FileData.cFileName);
//RECT rect;
//GetClientRect(&rect);
//TextOut(m_hdc, rect.right/2, rect.bottom/2, szPath, lstrlen(szPath));
//lstrcpy(m_view.m_szFileName, szPath);
HandleFile(szPath);
if (!FindNextFile(hSearch, &FileData))
{
if (GetLastError() == ERROR_NO_MORE_FILES)
{
::MessageBox(NULL, "Succss.",
"Search completed.", MB_OK);
fFinished = TRUE;
//m_view.m_bStart = false;
}
else
{
return -1;
}
}
}
if (!FindClose(hSearch))
{
return -1;
}
lstrcpy(szPath, m_szPathName);
lstrcat(szPath, TEXT("result.txt"));
ofstream outfile(szPath);
if(!outfile.is_open())
{
::MessageBox(NULL, "Cannot open the result.txt!",
"error.", MB_ICONERROR);
return -1;
}
vector<PAIR> vec;
map<string, int>::const_iterator it = m_wordcount.begin();
for(; it != m_wordcount.end(); it++)
{
vec.push_back(make_pair(it->first, it->second));
}
sort(vec.begin(), vec.end(),cmp);
vector<PAIR>::iterator iter = vec.begin();
while(iter != vec.end())
{
outfile << (*iter).first << "-------------" << (*iter).second << endl;
++iter;
}
return 0;
}
int CMainFrame::HandleFile(LPCTSTR lpFileName)
{
ifstream inFile(lpFileName);
if(!inFile)
return -1;
string s;
string word;
istringstream isstream;
while(getline(inFile, s))
{
isstream.str(s);
while(isstream >> word)
{
if(word[0] == '[')
continue;
if(!isalpha(word[word.size()-1]))
word.resize(word.size()-1);
for(string::size_type index = 0; index != word.size(); ++index)
{
word[index] = tolower(word[index]);
}
++m_wordcount[word];
}
isstream.clear();
}
inFile.close();
return 0;
}
当时写这个程序主要还是因为发现STL中容器很好使,就写了这个程序练练手
好像是晚上10点的时候最终写成的,当时还发到寝室群里
以前写代码,真是几乎不写注释啊
现在一般不这样了
一点说明:
if(word[0] == '[')
主要是因为当时用于处理新概念课文的字幕,所以去掉了每行开头的时间说明
最关键的数据结构是一个map,定义如下:
map<string, int> m_wordcount;
即每个单词的出现次数
另外,用C++的流来解析单词,而不是自己写函数