前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >文本查询TextQuery类文件编写

文本查询TextQuery类文件编写

作者头像
Michael阿明
发布2021-02-20 10:22:57
发布2021-02-20 10:22:57
1.1K00
代码可运行
举报
运行总次数:0
代码可运行

读取用户指定的任意文本文件,然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某单词在同一行中多次出现,程序将只显示该行一次。行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推。

textquery.h 头文件定义文件

代码语言:javascript
代码运行次数:0
复制
#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 头文件的实现文件

代码语言:javascript
代码运行次数:0
复制
#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行(个)元素的 vector
        lines_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,存成map
            word_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>();	//如果找到结尾了,没找到,返回空set
    else
        return 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 主函数

代码语言:javascript
代码运行次数:0
复制
#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;	//定义文本查询对象tq
    tq.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,返回其所有行号set
        print_results(locs,s,tq);	//打印tq对象,查询字符串s下对应所有行的行文本
    }
    return 0;
}

编译运行结果

g++ cpp cpp -o exename

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/10/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • textquery.h 头文件定义文件
  • textquery.cpp 头文件的实现文件
  • main_textquery.cpp 主函数
  • 编译运行结果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档