文本查询TextQuery类文件编写
读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推。
textquery.h 头文件定义文件
#ifndef TEXTQUERY_H //防止重复定义,名称大写
#define TEXTQUERY_H
#include<map>
#include<set>
#include<string>
#include<fstream>
#include<vector>class textquery
{public:typedef std::vector<std::string>::size_type line_no;void read_file(std::ifstream &is) //定义函数,读取文件{store_file(is); //调用函数,把打开的文件流存入文件build_map(); //调用函数,生成map容器}std::string text_line(line_no) const; //声明 行文本函数std::set<line_no> run_query(const std::string&) const; //声明查询函数,返回行号集合set//每一个字符串所在行(返回set<>多个行号)
private:void store_file(std::ifstream&); //声明函数void build_map(); //声明函数std::vector<std::string> lines_of_text; //定义每一行的文本作为一个元素存在vector里std::map<std::string, std::set<line_no> > word_map; //把每个string和其行号<set> 做成map
};
#endif
textquery.cpp 头文件的实现文件
#include "textquery.h"
#include<fstream>
#include<sstream>
using namespace std;//store_file函数实现
void textquery::store_file(ifstream &is)
{string textline;while(getline(is,textline)) //从文件流 is中获取每一行的文本,存成 n行(个)元素的 vectorlines_of_text.push_back(textline);
}//build_map函数实现
void textquery::build_map()
{for(line_no line_num = 0; line_num != lines_of_text.size(); ++line_num) //遍历 n行{istringstream line(lines_of_text[line_num]); //定义字符串流line(绑定每行的文本)string word;while(line >> word) //把字符串流line里的每个字符串word,和其行号line_num,存成mapword_map[word].insert(line_num);}
}//查询函数run_query实现
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>(); //如果找到结尾了,没找到,返回空setelsereturn loc->second; //如果找到了,返回迭代器指向对象的第二元素 set行号集合
}//文本行 text_line函数,返回某行的文本
string textquery::text_line(line_no line) const
{if(line < lines_of_text.size()) //如果行号没有超出范围,返回vector里的某个元素(一行文本)return lines_of_text[line];throw std::out_of_range("line number out of range"); //行号超出,则抛出异常
}
main_textquery.cpp 主函数
#include"textquery.h"
#include<iostream>
#include<string>
#include<stdexcept>
#include<fstream>
using namespace std;//单词加后缀函数
string make_plural(size_t ctr, const string &word, const string &ending)
{return (ctr == 1)?word:word+ending; //多个单词,后缀加s
}//打印某字符对应所有行的文本函数
void print_results(const set<textquery::line_no> &locs, const string &s, const textquery &file)
{typedef set<textquery::line_no> line_nums;line_nums::size_type size = locs.size(); //字符串的行号有多少个cout << "\n" << s << " occurs " << size << " " << make_plural(size, "time", "s") << endl;line_nums::const_iterator it = locs.begin();for(;it != locs.end();++it) //遍历行号set{cout << "\t(line " << (*it)+1 << ") " << file.text_line(*it) << endl;//输出每个行号对应的文本}
}
int main(int argc, char **argv)
{if(argc < 2) //判断输入文本名称参数没有{cerr << "No input file!" << endl;return EXIT_FAILURE;}ifstream infile;infile.open(argv[1]);if(!infile) //判断文件打开了没有{cerr << "can not open input file!" << endl;return EXIT_FAILURE;}textquery tq; //定义文本查询对象tqtq.read_file(infile); //读取文件(存储,生成map数据库)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); //查询字符串s,返回其所有行号setprint_results(locs,s,tq); //打印tq对象,查询字符串s下对应所有行的行文本}return 0;
}
编译运行结果
g++ cpp cpp -o exename
文本查询TextQuery类文件编写相关推荐
- 账户Account类文件编写(static成员使用)
static类成员是该类所有成员共享一份的数据,一处修改了,全部变更: static成员函数只能调用static成员数据: static const整形int,char,可以在类内声明和初始化,类外不 ...
- 屏幕Screen类文件编写
注意: inline 定义的函数必须放在 .h 文件中,否则编译器报错! 其次,注意写全称在 .h 里,如 std:: screen.h 头文件 #ifndef SCREEN_H #define SC ...
- 文本类文件与VS关联-实践
[问题描述] 为了方便办公,常把一类文本类文件使用vs工具打开,比如.sql后缀: 在办公电脑上,先后安装了Sqlserver.VS2003.VS2005.VS2008.由于开发工具直接从vs2003 ...
- 免费天气查询工具类源码,开箱即用,根据中国气象局API编写。高效稳定
文章目录 引言 相关依赖 WeatherUtil工具类代码 http工具类 测试 引言 使用Java语言,根据中国气象局API编写的查询天气工具类,代码引入就能用,代码中对异常做了处理,无论是否查询成 ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
- 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)
**01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...
- java怎编写么解析一个类型_DAY3:你必须知道的java虚拟机之类篇——类文件的结构...
马上过年啦,不知道大家今年有没有投资基金股票呢?是赚的盆满钵满还是拍断大腿,可以评论区一起交流交流,秀一秀哈哈,反正我是没来得及上车. 暴富西不可能暴富的啦,打工人嘛几能写写文章啦-记得点赞➕关注呀 ...
- c++ primer--容器的综合应用:文本查询程序
c++ primer–容器的综合应用:文本查询程序 我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在的行.如果某单词在同一行中多 ...
- C++ 容器的综合应用的一个简单实例——文本查询程序
[0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...
最新文章
- Retrofit 入门和提高
- nodejs(三) --- nodejs进程与子进程
- 开源项目成熟度分析工具-利用github api获取代码库的信息
- 2020-10-25(个人int误区)
- 论述类文本知识框架_考前知识梳理与答题技巧之论述类文本
- python数据可视化代码_python数据可视化
- 于我,过去,现在和未来 —— 西格里夫·萨松
- DBASK数据库提问平台问题集萃,首批近二十位专家团曝光
- Apache mod_rewrite
- 【NLP】第 6 章:XGBoost 超参数
- 谷歌这是要全面退出中国!
- 使用Windows批处理压缩文件
- TTL转HDMI 1.4,性能提升,pin to pin 芯片LT8618SXB
- ONOS(Open Network Operating System) from ONF
- 对输入的两个分数选择‘+’、‘-’、‘*’、‘/’四则运算,并以分数形式输出结果。输入:第一行先输入整数T,表示总共有T组数据。接下来共T行,每行输入分数形式的算术表达式。	输出:最简分数形
- html跑车模板,html5代码画兰博基尼跑车,6不6?
- 4. ElasticSearch——aggregations聚合分析
- dede php addfilter,织梦dede筛选功能+伪静态
- [网鼎杯 2020 朱雀组]Nmap
- unixtime时间转换mysql_MySQL中from_unixtime()时间转换
热门文章
- 斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...
- 修改内核的启动logo
- 数据结构——树的理解路线(总)
- postman安装和简单使用
- 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
- java----IO和NIO的区别
- Android 中如何计算 App 的启动时间?
- 简单几何(极角排序) POJ 2007 Scrambled Polygon
- magento tab(easy tables)标签应用
- 中兴5G和展锐原厂芯片开发,怎么选?