文本查询程序
来源:互联网 发布: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,因为程序中是以空格或回车作为分隔符
阅读全文
0 0
- 简单文本查询程序
- 文本查询程序
- 感悟:文本查询程序
- 文本查询程序
- 文本查询程序
- 文本查询程序
- 文本查询程序
- 文本查询程序
- C++ primer 文本查询程序
- <<c++ primer>>文本查询程序
- C++文本查询程序实例
- 容器的综合应用:文本查询程序
- c++ primer习题10.6 文本查询程序
- c++学习笔记-文本查询程序
- C++ 容器 综合应用 文本查询程序
- 文本查询程序--摘自c++primer
- C++ Primer 第五版 文本查询程序
- 【足迹C++primer】41、文本查询程序
- 史上最简单的SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)
- 论Python中缩进的重要性
- 搭建HDFS集群方法
- Linux MySql 命令
- Java自动化测试之鼠标悬停及文件上传
- 文本查询程序
- Python100例--001
- sql server 无法为该请求检索数据
- Python邮件收发(SMTP POP3)
- .net 将Excel文件导入数据库
- Spring的事务隔离级别和传播机制
- 根据指定行数拆分内表
- 1X1中卷积核的作用
- 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)