#ifndef TEXTQUERY_H
#define TEXTQUERY_H
#include<vector>
#include<string>
#include<set>
#include<map>
#include<sstream>
#include<fstream>
using namespace std;
class text_query{
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> line_of_text;
map<string,set<line_no> > word_map;
};
void text_query::store_file(ifstream & infile)
{
string line;
while(getline(infile,line))
line_of_text.push_back(line);
}
void text_query::build_map()
{
for(line_no line_num=0;line_num<line_of_text.size();++line_num){
istringstream s_in(line_of_text[line_num]);
string word;
while(s_in>>word)
word_map[word].insert(line_num);
}
}
set<text_query::line_no> text_query::run_query(const std::string & str) const
{
map<string,set<line_no> >::const_iterator it=word_map.find(str);
if(it!=word_map.end()){
return it->second;
}else
return set<line_no>();
}
string text_query::text_line(text_query::line_no l) const
{
if(l<line_of_text.size())
return line_of_text[l];
throw out_of_range("line number out of range!");
}
#endif TEXTQUERY_H
#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<ctime>
#include "text_query.h"
using namespace std;
void print_results(const set<text_query::line_no> & locs,const string & sought,const text_query &file)
{
set<text_query::line_no>::size_type st=locs.size();
cout<<"element "<<sought<<" occurs "<<st<<" times"<<endl;
for(set<text_query::line_no>::const_iterator ite=locs.begin();ite!=locs.end();++ite)
cout<<"\t(line "<<*ite+1<<") "<<file.text_line(*ite)<<endl;
}
int main(int argc,char **argv)
{
ifstream infile;
infile.open(argv[1]);
if(argc<2||!infile){
cerr<<"NO input file!"<<endl;
return EXIT_FAILURE;
}
text_query tq;
tq.read_file(infile);
while(true){
cout<<"enter word to look for ,or q to quit: ";
string s;
cin>>s;
if(!cin||s=="q") break;
set<text_query::line_no> locs=tq.run_query(s);
print_results(locs,s,tq);
}
return 0;
}