andylin02 发表于 2013-2-7 04:32:13

Word查询2

#pragma once#include <map>#include <string>#include <Windows.h>using namespace std;typedef map<string, string>MAP_WORD;class CPraseWord{public:CPraseWord(void);~CPraseWord(void);public:BOOL ParseWord(const char* lpszFile);BOOL GetWordInfo(const char* lpszWord, string& strInfo);private:MAP_WORD* GetMap(const char ch);BOOL AddToMap(const char* lpszStr, const int nLine, const int nWord);private:MAP_WORDm_mapWord;};#include "stdafx.h"#include "PraseWord.h"#include "macro.h"#define MAX_WORD_LEN 100CPraseWord::CPraseWord(void){}CPraseWord::~CPraseWord(void){}BOOL CPraseWord::ParseWord(const char* lpszFile){ASSERT_RETURN(lpszFile, FALSE);FILE* fp = fopen(lpszFile, "r");int nWord = 1;int nLine = 1;char ch = '\0';BOOL bLastSp = FALSE;int nCharPos = 0;char szWord = {0};while ( EOF != (ch = fgetc(fp)) ){switch (ch){case '\n':nLine++;nWord = 1;bLastSp = FALSE;nCharPos = 0;AddToMap(szWord, nLine, nWord);break;case ' ':case '\r':case ',':case ':':case '#':case '!':case '+':case '-':case '*':case '&':case '(':case ')':case '@':case '$':bLastSp = TRUE;nCharPos = 0;AddToMap(szWord, nLine, nWord);break;default:            if (bLastSp){nWord++;nCharPos = 0;memset(szWord, 0, sizeof(szWord));}szWord = ch;bLastSp = FALSE;break;}}if (NULL != fp){fclose(fp);fp = NULL;}return TRUE;}BOOL CPraseWord::AddToMap(const char* lpszStr, const int nLine, const int nWord){ASSERT_RETURN(lpszStr, FALSE);MAP_WORD* pMap = GetMap(lpszStr);if (NULL == pMap){return FALSE;}char szPlace = {0};::_snprintf(szPlace, sizeof(szPlace), "{%d, %d}", nLine, nWord);MAP_WORD::iterator it = pMap->find(lpszStr);if (pMap->end() == it){(*pMap) = szPlace;}else{it->second += ",";it->second += szPlace;}return TRUE;}BOOL CPraseWord::GetWordInfo(const char* lpszWord, string& strInfo){ASSERT_RETURN(lpszWord, FALSE);MAP_WORD* pMap = GetMap(lpszWord);if (NULL == pMap){return FALSE;}MAP_WORD::iterator it = pMap->find(lpszWord);if (pMap->end() == it){return FALSE;}strInfo = it->second;return TRUE;}MAP_WORD* CPraseWord::GetMap(const char ch){int nSub = ch - 'a';if ( (nSub >= 0) && (nSub < 26) ){return &m_mapWord;}nSub = ch - 'A';if ( (nSub >= 0) && (nSub < 26) ){return &m_mapWord;}if (0 == ch){return NULL;}return &m_mapWord;}// w_m.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "PraseWord.h"#include <iostream>#include <string>#include <Windows.h>#include <time.h>using namespace std;size_t time_stat(bool bBegin = true);int main(int argc, char* argv[]){CPraseWord pd;char* lpszFile = "./kjv.txt";if (argc >= 2){lpszFile = argv;}//DWORD dwStart = GetTickCount();time_stat(true);if (!pd.ParseWord(lpszFile)){cout << "prase file failed..." << endl;return -1;}cout << "parase file cost time:" << time_stat(false) << endl;//DWORD dwEnd = GetTickCount();//cout << "parase file cost time:" << dwEnd - dwStart << endl;while (TRUE){char szWord = {0};cout << "please input find parse word:";cin >> szWord;string str;//dwStart = GetTickCount();time_stat(true);pd.GetWordInfo(szWord, str);//cout << "search cost time:" << time_stat(false) << endl;size_t nCostTime = time_stat(false);//dwEnd = GetTickCount();//cout << "search cost time:" << dwEnd - dwStart << endl;if (str.empty()){cout << "can't find " << szWord << endl;}else{cout << str << endl;}cout << endl << endl;cout << "search cost time:" << nCostTime << endl;cout << "search total cost time:" << time_stat(false) << endl;//dwEnd = GetTickCount();//cout << "search total cost time:" << dwEnd - dwStart << endl;}return 0;}int gettimeofday(struct timeval *tv, void *tzp){time_t clock;struct tm tm;SYSTEMTIME wtm;GetLocalTime(&wtm);tm.tm_year = wtm.wYear - 1900;tm.tm_mon= wtm.wMonth - 1;tm.tm_mday = wtm.wDay;tm.tm_hour = wtm.wHour;tm.tm_min= wtm.wMinute;tm.tm_sec= wtm.wSecond;tm.tm_isdst= -1;clock = mktime(&tm);tv->tv_sec = (long)clock;tv->tv_usec = wtm.wMilliseconds * 1000;return 0;}size_t time_stat(bool bBegin){static struct timeval st_time_begin, st_time_end;static char szInfo;if (bBegin){gettimeofday(&st_time_begin, NULL);return 0;}else{gettimeofday(&st_time_end, NULL);return (st_time_end.tv_sec - st_time_begin.tv_sec) * 1000+ (st_time_end.tv_usec - st_time_begin.tv_usec) / 1000;}}
页: [1]
查看完整版本: Word查询2