2015年12月27日星期日

An example of TextQuery

//check the word inputed by cin in the "text" file

#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<memory>
#include<fstream>
#include<sstream>
class TextQuery{
  public:
    std::vector<std::string>::size_type line_no;
    std::map<std::vector<std::string>::size_type,int> query(std::string keyword,std::shared_ptr<std::vector<std::string>> file);
    std::shared_ptr<std::vector<std::string>> save_file(std::ifstream& inputer);
    void outputer(std::ostream& output,std::string keyword);
    void output_file(std::ofstream& outputf,std::string keyword);
    TextQuery(std::string url,std::string keyword);
  private:
    std::shared_ptr<std::vector<std::string>> file;
    std::map<std::vector<std::string>::size_type,int> result;
};
TextQuery::TextQuery(std::string url,std::string keyword){
  this->line_no = 0;
  std::ifstream inputer(url,std::ifstream::in);
  this->file = this->save_file(inputer);
  this->result = this->query(keyword,this->file);
}
std::shared_ptr<std::vector<std::string>> TextQuery::save_file(std::ifstream& inputer){
  std::shared_ptr<std::vector<std::string>> saver = std::make_shared<std::vector<std::string>>();
  std::string temp;
  while(getline(inputer,temp)){
    saver->push_back(temp);
    line_no ++;
  }
  return saver;
}
std::map<std::vector<std::string>::size_type,int> TextQuery::query(std::string keyword,std::shared_ptr<std::vector<std::string>> file){
  std::vector<std::string>::size_type count = 0;
  std::string temp;
  std::map<std::vector<std::string>::size_type,int> result;
  auto ite1 = file->cbegin(), ite2 = file->cend();
  while(ite1 != ite2 ){
    std::istringstream str_input(*ite1);   
    while(str_input >> temp){
      if(temp == keyword){
        if(result.find(count) == result.cend()) result.insert(std::make_pair(count,1));
        else
           result[count]++;
      }
    }
    ite1 ++;
    count ++;
  }
  return result;
}
void TextQuery::outputer(std::ostream& output,std::string keyword){
  int sum = 0;
  auto ite1 = this->result.cbegin();
  auto ite2 = this->result.cend();
  while(ite1 != ite2){
    sum += ite1->second;
    ite1 ++;
  }
  output << keyword << " occurs "<<sum<<" times"<<'\n';
  ite1 = this->result.cbegin();
  while(ite1 != ite2){
  if(ite1->second == 1 ){
    output<<"("<< ite1->second << " time in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
  }
  else{
    output<<"("<< ite1->second << " times in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
  }
  ite1 ++; 
  }
}
void TextQuery::output_file(std::ofstream& outputf,std::string keyword){
  int sum = 0;
  auto ite1 = this->result.cbegin();
  auto ite2 = this->result.cend();
  while(ite1 != ite2){
    sum += ite1->second;
    ite1 ++;
  }
  outputf << keyword << " occurs "<<sum<<" times"<<'\n';
  ite1 = this->result.cbegin();
  while(ite1 != ite2){
    if(ite1->second == 1 ){
      outputf<<"("<< ite1->second << " time in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
    }
    else{
      outputf<<"("<< ite1->second << " times in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
    }
    ite1 ++; 
  }
}
int main(){
  std::string keyword;
  std::cin >> keyword;
  std::string url = "./text";   //the file name
  TextQuery query(url,keyword);
  std::ofstream outputf("./textquery",std::ofstream::out);//output in "textquery"
  query.output_file(outputf,keyword);
}

没有评论:

发表评论