文本查询程序

#include <iostream> 
#include <fstream>
#include <sstream>
#include <string>  
#include <set>  
#include <map>  
#include <vector> 
using namespace std;

class TextQuery{
public:
	typedef std::vector<std::string>::size_type line_no;
	void read_file(std::ifstream &is){
		store_file(is);
		build_map();
	}
	std::set<line_no> run_query(const std::string&) const;
	std::string text_line(line_no) const;
private:
	void store_file(std::ifstream&);
	void build_map();
	std::vector<std::string>  lines_of_text;
	std::map<std::string,std::set<line_no>>  word_map;
};
    ifstream& open_file(ifstream &in,const string &file){
		in.close();
		in.clear();
		in.open(file.c_str());
		return in;
	}
	string make_plural(size_t ctr,const string &word,const string &ending){
		return (ctr == 1) ? word : word + ending;
	}

	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 << " " << make_plural(size,"time","s") << endl;
		line_nums::const_iterator it = locs.begin();
		for(; it != locs.end();++it){
			cout << "\t(line " << (*it) + 1 << ")" << file.text_line(*it) << endl;
		}

	}
	/*********使用getline读取一行,每读入一行就将它添加到lines_of_text的vector对象*******/
	void TextQuery::store_file(ifstream &is){
		string textline;
		while(getline(is,textline))
			lines_of_text.push_back(textline);
	}
	/*****将istringstream对象line与当前行绑定起来,使用istringstream的输入操作符读入该行每个单词*/
	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);//不管是否添加了word,下标都返回一个set对象
		}
	}
	/********成功找到string,函数返回关联这个string的set对象********/
	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>();  //没找到,返回空的set对象
		else
			return loc->second;
	}

	/*输出出现该单词的每一行*/
	string TextQuery::text_line(line_no line) const{
		if(line <  lines_of_text.size())
             return lines_of_text[line];
		throw std::out_of_range("line number out of range");
	}
int main(int argc,char **argv){
	ifstream infile;
	if(argc < 2 || !open_file(infile,argv[1])){
		cerr << "No input file"<< endl;
		return EXIT_FAILURE;
	}
	TextQuery 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<TextQuery::line_no>  locs = tq.run_query(s);
		print_results(locs,s,tq);
	}

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值