C++实现简单的文本查询

  1 该程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次,行号按升序显示。
  2
  3 以下是代码实现:
  4
  5 #include <ctype.h>
  6 #include <iostream>
  7 #include <string>
  8 #include <map>
  9 #include <set>
 10 #include <vector>
 11 #include <sstream>
 12 #include <fstream>
 13 #include <algorithm>
 14 #include <iterator>
 15 using std::cout;
 16 using std::endl;
 17 using std::map;
 18 using std::set;
 19 using std::vector;
 20 using std::string;
 21 using std::ifstream;
 22 using std::ofstream;
 23 using std::istringstream;
 24
 25 class Query
 26 {
 27     public:
 28         void readFile(const string filename);
 29         void query(const string & world);
 30
 31     private:
 32         vector<string> _lines;
 33         map<string,set<int>> word2line;
 34         map<string,int> _wordFreq;
 35 };
 36
 37 void Query::readFile(const string filename)
 38 {
 39     ifstream ifs(filename);
 40     if(!ifs.good())
 41     {
 42         cout << "Oops!" << endl;
 43         return;
 44     }
 45     string line;
 46     int setnumber = 0;
 47     while(getline(ifs,line))
 48     {
 49         _lines.push_back(line);
 50         ++setnumber;
 51         istringstream iss(line);
 52         string word;
 53         while(iss >> word)
 54         {
 55             map<string,int>::iterator it = _wordFreq.begin();
 56             while(it != _wordFreq.end())
 57             {
 58                 if(word==it->first)
 59                 {
 60                     ++(it->second);
 61                     word2line[word].insert(setnumber);
 62                     break;
 63                 }
 64                 ++it;
 65             }
 66             if(it == _wordFreq.end())
 67             {
 68                 _wordFreq[word]=1;
 69                 word2line[word].insert(setnumber);
 70             }
 71         }
 72     }
 73     ifs.close();
 74 }
 75
 76 void Query::query(const string & word)
 77 {
 78     if(!_wordFreq[word])
 79     {
 80         cout << "word:" << word << " --> Not found!" << endl;
 81     }
 82     else
 83     {
 84         cout << word << " occurs " << _wordFreq[word] << " times." << endl;
 85         for(auto & elem : word2line[word])
 86         {
 87             cout << "   (line " << elem << ") " << _lines[elem-1] << endl;
 88         }
 89     }
 90 }
 91
 92 int main(int argc,char *argv[])
 93 {
 94     if(argc!=3)
 95     {
 96         cout << "Oops!" << endl;
 97         return -1;
 98     }
 99     Query qur;
100     qur.readFile(argv[1]);
101     qur.query(argv[2]);
102
103     return 0;
104 }
时间: 2024-11-14 16:31:35

C++实现简单的文本查询的相关文章

文本查询程序

我们实现一个简单的文本查询程序.我们的程序允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及所在行的列表.如果一个单词在一行中出现多次,此行只列出一次. #include<iostream> #include<map> #include<set> #include<string> #include<vector> #include<fstream> #include<sstream> #include&l

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_73_面向对象编程 -再谈文本查询示范

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_38_STL实践与分析(12)--容器的综合应用:文本查询程序

STL 实践与分析 -- 容器的综合应用:文本查询程序 引言: 本章中最重点的实例,因为不需要用到 multiset 与 multimap 的内容,于是将这一小节提到了前面,通过这个实例程序,大师分析问题的智慧,大师的编程风格,大师对程序的控制能力,由此可见一斑.因此,我对这一小节的内容几乎不做修改,或只做很小的更改(因为有些东西不同人有不同的理解),搬出来,以供大家仔细品读. 要求: 我们的程序将读取用户指定的 任意文本文件 , 然后允许用户从该文件中查找单词. 查询的结果是该单词出现的次数 

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

第十四篇:一个文本查询程序的实现

前言 本文将讲解一个经典的文本查询程序,对前面所学的容器相关知识进行一个从理论到实际的升华,同时也对即将学习的面向对象知识来一次初体验. 程序描述 要求实现这样一个程序:读取用户指定的文件,然后允许用户从中查找某个单词所在的位置. 一个面向过程的落后的设计思想 将待检索文件以行为单位存放到Vector容器中,然后遍历容器,将容器内元素依次转存到字符串流对象中,然后在内层遍历这个字符串流对象,检索是否存在与给定单词匹配的单词.如果有则输出该行内容以及该行序号. 落后的原因及先进的设计思想 这是我以

R语言:用简单的文本处理方法优化我们的读书体验

前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实就是继续讲一下用R语言读书的事情啦,讲讲怎么用它里面简单的文本处理方法,来优化我们的读书体验,如果读邮件和读代码也算阅读的话..用的代码超级简单,不涉及其他包 这里讲两个示例,结尾再来吐槽和总结. 1)R-Blogger订阅邮件拆分 2) R代码库快速阅读方法 不在博客园上阅读时才会看到的,这篇博文归 http://www.cnblogs.com/weibaar所有 仅保证在博客园博客上的排版干净利索

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

数据库 简单的数据查询

简单的数据查询 1.查询的基本结构: select[distinct] */列名 from table 表名 [where condition] [order by] 2.投影的操作:指定查询结果中能够显示的列 语法:select 列名列表 from 表名; (1):选择多列查询,列名之间用“,”隔开 (2):单列时,只单个. (3):若选择所有列,则用*代替. 3.表名前缀:本列无多大意义,但在复杂的多表查询的情况下,很有用. 语法:select 列名表名 from 表名; 4.列别名(as)