文本查询程序

来源:互联网 发布:pla算法 matlab 编辑:程序博客网 时间:2024/06/06 01:06

转自:C++ Primer

TextQuery类头文件:textQuery.h

#include<vector>#include<set>#include<map>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;};

textQuery.cpp

#include "stdafx.h"#include"textQuery.h"//#include<iostream>#include<string>#include<fstream>#include<sstream>using namespace std;//存储输入文件void TextQuery::store_file(ifstream &is){string textline;while (getline(is, textline))lines_of_text.push_back(textline);}//建立单词map容器, map<string,set<line_num>> ,map<单词,行数>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>(); //没找到,返回空的set对象elsereturn loc->second;    //这里返回的是set对象的副本,如果文件很大,则可能复制set对象的代价会很大,//其他方法:返回一队pair对象,存储一对指向set中元素的迭代器;  返回set对象的const引用}//run_query返回值的使用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");}


main.cpp

#include "stdafx.h"#include"textQuery.h"#include<fstream>#include<iostream>#include<string>using namespace std;//open in binding it to the given fileifstream& open_file(ifstream &in, const wstring &file){in.close();   //因为不清楚流in的状态,所以先调用close和clear将其设置为有效的状态in.clear();//if the open fails,the stream will be in an invalid statein.open(file.c_str());return in;  //condition is good if open succeeded}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, "times", "s") << endl;line_nums::const_iterator it = locs.begin();for ( ; it!=locs.end(); it++){cout << "\t(line " << *(it)+1 << ")" << file.text_line(*it) << endl;}}int _tmain(int argc, _TCHAR* 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:" << 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;}

设置查询文本文件


结果


如果查找的单词跟有标点符号,则查找不到,如上面的hello,因为程序中是以空格或回车作为分隔符

原创粉丝点击