C++ primer 文本查询程序

#include<map>
#include<iostream>
#include<fstream>
#include<vector>
#include<set>
#include<string>
#include<sstream>
using namespace std;
/*
  读取用户指定的任意文本文件,然后允许用户从该文本中查找单词。
  查询的结果是该单词出现的次数,并列出每次出现所在的行。如果一个单词在一行
  中多次出现,程序只将该行显示一次。行号按升序显示。 

*/
class TextQuery
{
 
  public:
  typedef vector<string>::size_type line_no;
  
  void read_file(ifstream &is)
  {
    store_file(is);
    build_map();      
  }          
  set<line_no> run_query(const string & ) const;
  string text_line(line_no) const;
  
   private:
  void store_file(ifstream &);
  void build_map();
  
  vector<string> lines_of_text;
  
  map<string, set<line_no> > word_map;  
         
    
    
};

void TextQuery::store_file(ifstream &is)
{
   string textline;
   while(getline(is,textline))
   {
        lines_of_text.push_back(textline);
        }    
}

void TextQuery::build_map()
{
  for(line_no line_num = 0; line_num != lines_of_text.size(); ++line_num)
  {
    istringstream line(lines_of_text[line_num]);
    string word;
    while(line >> word)
    {
        word_map[word].insert(line_num);
        }      
  }    
}
set<TextQuery::line_no>
TextQuery::run_query(const string &query_word) const
{
  map<string,set<line_no> >::const_iterator loc = word_map.find(query_word);
  if(loc == word_map.end())
      return set<line_no>();
      else
      return loc->second;  
    
 }
 
 string TextQuery::text_line(line_no line) const
 {
   if(line < lines_of_text.size())
      return lines_of_text[line];        
           
}

void print_results(const set<TextQuery:: line_no>& locs, const string & sought,const TextQuery &file)
{
    typedef set<TextQuery::line_no> line_nums;
    line_nums::size_type size  = locs.size();
    cout << "\n" << sought << "occurs" 
         <<size << " "
         << "times" << endl;
    line_nums:: const_iterator it = locs.begin();
    for( ; it != locs.end(); ++it )
    {
      cout << "\t(line"
           << (*it) + 1 << ")"
           << file.text_line(*it) << endl;    
    }     
}

int main()
{ string filename;
  ifstream infile;
  cout << "Input the filename which you want to query :" << endl;
  cin >> filename;
  infile.open(filename.c_str(),ios::in);

   TextQuery tq;
   tq.read_file(infile);
   while(true)
   {
     cout << "enter word to look for, or q to quit: " << endl;    
     string s;
     cin >> s;
     if( !cin || s == "q")
          break;
     set<TextQuery::line_no> locs = tq.run_query(s);
     print_results(locs,s,tq);
        
    } 
  return 0;    
}

总结:注释 在 《C++ primer》 P325 ~ 331。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值