清风竹林

ぷ雪飘绛梅映残红
   ぷ花舞霜飞映苍松
     ----- Do more,suffer less

单词统计

要求:读取一个文本,然后统计里面出现的单词,打印每个单词出现的次数。仅仅考虑英文单词的情形,不考虑中文

小乓练题:
int main(int argc, char* argv[]) 
{    
    
using namespace std;

    ifstream infile(
"c:\\a.txt",ios::binary );
    
if(!infile)
    {
        cout
<<"Can not open sourse file!"<<endl;
        
return 0;
    }
    
//ofstream outfile("out.txt");
    
//if(!outfile)
    
//{
    
//    cout<<"Can not open destination file!"<<endl;
    
//}
    
    
int nLength = 0;
    
char * pBuffer;

    
// get length of file:
    infile.seekg (0, ios::end);
    nLength 
= infile.tellg();
    infile.seekg (
0, ios::beg);
    
    
    
//read the file to the buffer
    pBuffer = new char[nLength];
    memset(pBuffer, 
0, nLength);
    infile.read(pBuffer,nLength);
    infile.close();

    
//copy the buffer to the string s
    string s = pBuffer;
    delete[] pBuffer;
    pBuffer 
= NULL;


    
string temp;

    vector
<string> vecSubstr;
    vector
<int> vecCount;

    
int pre=0,next=0;

    
while(next<nLength)
    {
        pre
=next;
        
//find the word
        while((next<nLength)&&isalnum(s[next]))
        {
            next
++;
        }
        
if(pre!=next)
        {
            
//计算当前的单词个数
            temp = s.substr(pre,next-pre);
            cout
<<temp<<endl;
            
//std::vector<std::string>::iterator iter = std::find(vecSubstr.begin(), vecSubstr.end(), temp);
            
//if (vecSubstr.end() != iter)
            
//{
            
//    std::cout<<temp<<std::endl;
            
//}else
            
//{
            
//    vecSubstr.push_back(temp);
            
//}

            unsigned 
int iPosition=0;
            

            
while(iPosition<vecSubstr.size())
            {
                
                
if(vecSubstr[iPosition].compare(temp)==0)
                    
break;
                    
                iPosition
++;
                
            }
            
            
if (iPosition==vecSubstr.size())
            {
                vecSubstr.push_back(temp);
                vecCount.push_back(
1);
            }
            
else
            {
                vecCount[iPosition]
++;
            }            
            
        }
        next
++;
    }
    
for (int j=0;j<vecSubstr.size();j++)
    {
        cout
<<vecSubstr[j]<<endl<<vecCount[j]<<endl;
    }

    
//for(int i=0;i<substr.size();i++)
    
//{
    
//    cout<<substr[i]<<endl;
    
//    cout<<count[i]<<endl;
    
//}

    
//delete[] pBuffer;
    
//pBuffer = NULL;

    system(
"pause");

    
return 0;
}

C++代码:

int main(int argc, char* argv[])
{
    
    
// 文件路径
    char* szPath = "C:\\text.txt";
    
    std::ifstream fin(szPath);
    
if (!fin)
    {
        std::cout
<<"Can not open file"<<std::endl;
        
return -1;
    }
    
// 通常我们这样读取一个文本文件的全文
    std::string strText = std::string(std::istreambuf_iterator<char>(fin), std::istreambuf_iterator<char>());

    typedef std::map
<std::stringint> CountMap;
    CountMap counter;

    
int nLength = strText.length();
    
int nLeft = 0;
    
int nRight = -1;

    
while(nRight<nLength)
    {
        nLeft 
= nRight+1;
        
// 找到第一个是字母的位置
        while (nLeft<nLength && !isalnum(strText[nLeft]))
        {
            
++nLeft;
        }
        nRight 
= nLeft+1;
        
// 找到第一个非字母的位置
        while (nRight<nLength && isalnum(strText[nRight]))
        {
            
++nRight;
        }
        
// 取nRight-nLeft可以保证取到的是一个word,其中不会含有字符
        if (nRight < nLength)
        {
            
// 提取单词
            std::string strWord = strText.substr(nLeft, nRight - nLeft);
            
// 加入记数器
            counter[strWord]+=1;    
        }        
    }
    
    
// 打印输出
    for (CountMap::iterator iter = counter.begin(); counter.end()!=iter; ++iter)
    {
        std::cout
<<iter->first<<"\t\t"<<iter->second<<std::endl;
    }

    system(
"pause");
    
return 0;
}

python 代码:

import re

filepath
=r'c:/text.txt'
with open(filepath) as file:
    text
=file.read()
    text
=re.split('\W+', text)
    d
={}
    
for item in text:
        d[item]
=d.get(item, 0) +1 
    
for key, value in d.items():
        
print('%s\t\t%s'%(key, value))

小乓加油!














posted on 2008-11-19 10:29 李现民 阅读(855) 评论(0)  编辑 收藏 引用 所属分类: 小乓练题


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理