文本查询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
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是小样本学习?这篇综述文章用166篇参考文献告诉你答案

一只小狐狸带你解锁 炼丹术&NLP 秘籍来源&#xff1a;机器之心什么是小样本学习&#xff1f;它与弱监督学习等问题有何差异&#xff1f;其核心问题是什么&#xff1f;来自港科大和第四范式的这篇综述论文提供了解答。数据是机器学习领域的重要资源&#xff0c;在数据缺少的…

CCKS 2018 | 前沿技术讲习班

时间&#xff1a;8月14日-15日地点&#xff1a;南开大学泰达学院大报告厅日程安排时间主题特邀讲者8月14日上午&#xff08;8:30 – 10:00&#xff09;Deep Knowledge Graph Reasoning&#xff08;10:30-12:00&#xff09;Exploiting and Reasoning With Open Knowledge GraphW…

Java必考题目之JVM面试题目和答案

JVM内存模型 首先我们来了解一下JVM的内存模型的怎么样的&#xff1a; 1.堆&#xff1a;存放对象实例&#xff0c;几乎所有的对象实例都在这里分配内存 堆得内存由-Xms指定&#xff0c;默认是物理内存的1/64&#xff1b;最大的内存由-Xmx指定&#xff0c;默认是物理内存的1/4…

听说读论文也有trick?这篇文章告诉你深度学习论文阅读最佳姿势

2020年的今天&#xff0c;我们的专业是deep learning&#xff0c;但是我们要keep learning&#xff0c;每天早上一睁眼&#xff0c;arxiv每天更新上百篇的论文&#xff0c;著名微博博主爱可可-爱生活保持也在推送最新的deep learning资讯和论文。我们不缺少计算机视觉论文&…

屏幕Screen类文件编写

注意&#xff1a; inline 定义的函数必须放在 .h 文件中&#xff0c;否则编译器报错&#xff01; 其次&#xff0c;注意写全称在 .h 里&#xff0c;如 std:: screen.h 头文件 #ifndef SCREEN_H #define SCREEN_H #include<string> #include<iostream>class Scre…

机器翻译自动评估-BLEU算法详解

机器翻译自动评估-BLEU算法详解 版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/qq_31584157/article/details/77709454 </div><link rel"stylesheet" href"https://csdnimg.cn/re…

论文浅尝 | 利用Lattice LSTM的最优中文命名实体识别方法

本文转载自公众号&#xff1a;机器之心。选自arXiv作者&#xff1a;Yue Zhang、Jie Yang机器之心编译参与&#xff1a;路、王淑婷近日&#xff0c;来自新加坡科技设计大学的研究者在 arXiv 上发布了一篇论文&#xff0c;介绍了一种新型中文命名实体识别方法&#xff0c;该方法利…

最全MySQL面试60题和答案

Mysql中有哪几种锁&#xff1f; 1.表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c;发生锁冲突的概率最高&#xff0c;并发度最低。 2.行级锁&#xff1a;开销大&#xff0c;加锁慢&#xff1b;会出现死锁&#xff1b;…

中文幽默语料库构建与计算项目(幽默等级识别,幽默类型识别,隐喻类型识别,隐喻情绪识别)

ChineseHumorSentiment chinese Humor Detection or Computation based on corpus and nlp methods, 基于语料库与NLP方法的中文幽默计算与检测项目 项目地址:https://github.com/liuhuanyong/ChineseHumorSentiment 项目介绍 幽默多指令人发笑的品质或者具有发笑的能力&…

账户Account类文件编写(static成员使用)

static类成员是该类所有成员共享一份的数据&#xff0c;一处修改了&#xff0c;全部变更&#xff1b; static成员函数只能调用static成员数据&#xff1b; static const整形int&#xff0c;char&#xff0c;可以在类内声明和初始化&#xff0c;类外不必再声明&#xff08;跟编译…

百度机器阅读理解比赛赛后总结

百度机器阅读理解比赛赛后总结 <!-- 文章内容 --><div data-note-content"" class"show-content"><div class"show-content-free"><p>2018年4-5月间&#xff0c;笔者参加了百度举办的<a href"https://links.jia…

课程 | 《知识图谱》第二期重磅来袭!

参团&#xff0c;咨询&#xff0c;查看课程&#xff0c;请点击【阅读原文】↓↓

All in Linux:一个算法工程师的IDE断奶之路

一只小狐狸带你解锁 炼丹术&NLP 秘籍在合格的炼丹师面前&#xff0c;python可能被各种嫌弃前不久卖萌屋的lulu写了一篇vim的分享《算法工程师的效率神器——vim篇》&#xff0c;突然想起来自己也有一篇攒了几年灰的稿子&#xff0c;在小伙伴的怂恿下跟小夕强行翻新了一下&a…

2019 阿里Java 4轮面试题,含必考题答案参考!

Java一面 hashmap源码问题 HashMap底层结构 put操作讲一下 HashMap、HashMap如何保证线程安全、ConcurrentHashMap JVM有哪些回收算法&#xff0c;对应的收集器有哪些&#xff1f; jvm g1的内存模型讲一下&#xff0c;G1和CMS收集器的区别&#xff1f;以及G1收集器对CMS的改…

技术动态 | 自底向上构建知识图谱全过程

本文转载自公众号&#xff1a;阿里技术。“The world is not made of strings , but is made of things.”——辛格博士&#xff0c;from Google.知识图谱&#xff0c;是结构化的语义知识库&#xff0c;用于迅速描述物理世界中的概念及其相互关系&#xff0c;通过将数据粒度从d…

数据结构--单链表single linked list数据结构C++实现

2018年2月开始学习的 C Primer&#xff0c;到今天2019年3月已经整整一年了&#xff0c;非常感谢在一起交流的小伙伴&#xff0c;是你们的无私帮助和分享使得我能跨越很多技术的坑&#xff0c;感谢你们&#xff01;期待我们2019年一起拿下《数据结构与算法》以及Python入门。 …

搜索中的 Query 理解及应用

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

GAN原理,优缺点、应用总结

<h1 class"csdn_top" id"gan原理优缺点应用总结"><a name"t0"></a>GAN原理&#xff0c;优缺点、应用总结</h1> <br> 本文已投稿至微信公众号–机器学习算法全栈工程师&#xff0c;欢迎关注</article><p&…

java程序员进阶必读书单

以下是我推荐给Java开发者们的一些值得一看的好书&#xff0c;从java基础开始到高级&#xff0c;以及从高级进阶到架构等的书单。 基本都是经典之作&#xff0c;可以利用工作闲暇的时间&#xff0c;系统阅读。 本文作者&#xff0c;优知学院创始人 陈睿 优知学院是IT人在线进…

胡伟 | 面向多实体人机协作消解的对比表生成自动化方法

众包实体消解实体消解&#xff08;Entity Resolution&#xff0c;简称ER&#xff09;旨在发现不同知识图谱中指称真实世界相同对象的实体。众包实体消解&#xff08;Crowd ER&#xff09;在使用机器的基础上&#xff0c;还使用人来完成实体消解任务。众包实体消解的一个常见流程…