C++如何读取一个大文件,并识别各个字符串出现的次数,找到次数最多的。输出这个字符

也就是比如这个是网站的点击记录,怎么找到最热的关键词.求教大家了。
不要只写代码,写一下思想,以及会用到什么算法。谢谢啦,好的给加分哦。
(是不是先得识别出各个字符串?)
最后问一下!怎么遍历所存的关键字,然后输出,是所有,不是单独一个·

#include <stdio.h>
#include <string.h>

int main()
{
char s[4]="abc",sc='d';//比较的字符串和字符
FILE *fp;
char filename[100],c;
int i=0,n1=0,n2=0;
long fpos,len;

printf("input filename:\n");
gets(filename);//输入文件名称

if((fp=fopen(filename,"r"))==NULL)//打开文件
{
printf("open %s error!\n",filename);
return 1;
}

len=strlen(s);
c=fgetc(fp);
while(!feof(fp))
{
if(c==s[0])//如果第一个字符相等,比较剩下的字符串
{
fpos=ftell(fp);//记住当前文件指针位置
for(i=1;i<len;i++)
{
if(fgetc(fp)!=s[i])//如果不匹配,跳出循环
{
fseek(fp,fpos,0);//重新设置指针位置
break;
}
}
if(i==len)//如果匹配成功,累加数目
n1++;

}
if(c==sc)//与字符sc匹配,累加数目
n2++;
c=fgetc(fp);
}

printf("\n与字符串%s匹配的有%d个\n",s,n1);//输出匹配个数
printf("与字符%c匹配的有%d个\n",sc,n2);
getchar();
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-31
是先得识别出各个字符串
#include <fstream>
#include <iostream>
#include <cstdlib>
#include <map>
#include <iomanip>
using namespace std;
int main()
{
map<string,int>Q;
map<string,int>::iterator it;
ifstream fin("C:\\Users\\www\\Desktop\\temp\\b.txt");//fstream文件流读文件,文件路径自己改
string str;
while(fin>>str)
{
Q[str]++; //循环读文件到map容器Q
}
cout<<"统计:\n"<<setw(20)<<"关键词"<<setw(20)<<"次数\n";
string maxstr="";
int maxcount=0;
for(it=Q.begin();it!=Q.end();it++){
cout<<setw(20)<<it->first<<setw(20)<<it->second<<endl; //输出所有关键词的个数统计
if(maxcount<it->second){//判断次数最多的关键词
maxcount=it->second;
maxstr=it->first;
}
}
cout<<"最热关键词:"<<maxstr<<endl;
//system("pause");
return 0;
}
第2个回答  2011-08-31
这个网站点击用的是优先队列之类的数据结构,点击率高就前移,所以最高的在队头附件(有时把最近使用的放队头)。
而不是记录在一个文件然后每次读取判断。
用文件流读取文件搭配相应的数据结构存储,另设记录数组存储不重复的关键字与出现次数
第3个回答  2011-08-30
1)对于大文件,一般是分段读取的。
2)有很多关键字,又要统计关键字出现的次数,那么用键值对的方式,键是关键字,值是出现的次数,来保存比较合适。
3)识别关键字,要看你怎么定义【一个关键字】,一般没有空白字符分割的字符串就可以当做一个关键字了。追问

我们老师说要写200-300行,您觉得是怎么个意思?

追答

对程序的长度还有要求的啊。。。这个真无聊。。。没动手之前我也摸不准要多少行,但100多行应该要的。

第4个回答  2011-08-31
1. 字符串拆分
2. 倒排索引
3. 热度排序
相似回答