读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 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类文件编写相关推荐

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

    static类成员是该类所有成员共享一份的数据,一处修改了,全部变更: static成员函数只能调用static成员数据: static const整形int,char,可以在类内声明和初始化,类外不 ...

  2. 屏幕Screen类文件编写

    注意: inline 定义的函数必须放在 .h 文件中,否则编译器报错! 其次,注意写全称在 .h 里,如 std:: screen.h 头文件 #ifndef SCREEN_H #define SC ...

  3. 文本类文件与VS关联-实践

    [问题描述] 为了方便办公,常把一类文本类文件使用vs工具打开,比如.sql后缀: 在办公电脑上,先后安装了Sqlserver.VS2003.VS2005.VS2008.由于开发工具直接从vs2003 ...

  4. 免费天气查询工具类源码,开箱即用,根据中国气象局API编写。高效稳定

    文章目录 引言 相关依赖 WeatherUtil工具类代码 http工具类 测试 引言 使用Java语言,根据中国气象局API编写的查询天气工具类,代码引入就能用,代码中对异常做了处理,无论是否查询成 ...

  5. C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)

    C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...

  6. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  7. java怎编写么解析一个类型_DAY3:你必须知道的java虚拟机之类篇——类文件的结构...

    马上过年啦,不知道大家今年有没有投资基金股票呢?是赚的盆满钵满还是拍断大腿,可以评论区一起交流交流,秀一秀哈哈,反正我是没来得及上车. 暴富西不可能暴富的啦,打工人嘛几能写写文章啦-记得点赞➕关注呀 ...

  8. c++ primer--容器的综合应用:文本查询程序

    c++ primer–容器的综合应用:文本查询程序 我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在的行.如果某单词在同一行中多 ...

  9. C++ 容器的综合应用的一个简单实例——文本查询程序

    [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...

最新文章

  1. Retrofit 入门和提高
  2. nodejs(三) --- nodejs进程与子进程
  3. 开源项目成熟度分析工具-利用github api获取代码库的信息
  4. 2020-10-25(个人int误区)
  5. 论述类文本知识框架_考前知识梳理与答题技巧之论述类文本
  6. python数据可视化代码_python数据可视化
  7. 于我,过去,现在和未来 —— 西格里夫·萨松
  8. DBASK数据库提问平台问题集萃,首批近二十位专家团曝光
  9. Apache mod_rewrite
  10. 【NLP】第 6 章:XGBoost 超参数
  11. 谷歌这是要全面退出中国!
  12. 使用Windows批处理压缩文件
  13. TTL转HDMI 1.4,性能提升,pin to pin 芯片LT8618SXB
  14. ONOS(Open Network Operating System) from ONF
  15. 对输入的两个分数选择‘+’、‘-’、‘*’、‘/’四则运算,并以分数形式输出结果。输入:第一行先输入整数T,表示总共有T组数据。接下来共T行,每行输入分数形式的算术表达式。 输出:最简分数形
  16. html跑车模板,html5代码画兰博基尼跑车,6不6?
  17. 4. ElasticSearch——aggregations聚合分析
  18. dede php addfilter,织梦dede筛选功能+伪静态
  19. [网鼎杯 2020 朱雀组]Nmap
  20. unixtime时间转换mysql_MySQL中from_unixtime()时间转换

热门文章

  1. 斯柯达柯珞克显示服务器错误,斯柯达柯珞克原来还有四驱的版本,不信你看!...
  2. 修改内核的启动logo
  3. 数据结构——树的理解路线(总)
  4. postman安装和简单使用
  5. 掌握常见的内部排序方法(插入排序,冒泡排序,选择排序,快速排序,堆排序,希尔排序,归并排序,基数排序等)...
  6. java----IO和NIO的区别
  7. Android 中如何计算 App 的启动时间?
  8. 简单几何(极角排序) POJ 2007 Scrambled Polygon
  9. magento tab(easy tables)标签应用
  10. 中兴5G和展锐原厂芯片开发,怎么选?