<<c++ primer>>文本查询程序

#ifndef _TEXTQUERY_H
#define _TEXTQUERY_H

#include <vector>
#include <string>
#include <set>
#include <map>
#include <fstream>
#include <sstream>

class TextQuery
{
public:
	typedef std::vector<std::string>::size_type line_no;
	void read_file(std::ifstream &is)
	{
		store_file(is);
		build_map();
	}
	std::set<line_no> run_query(const std::string&) const;
	std::string text_line(line_no) const;
private:
	void store_file(std::ifstream&);
	void build_map();
	std::vector<std::string> lines_of_text;
	std::map<std::string,std::set<line_no>> word_map;
};

void TextQuery::store_file(std::ifstream &is)
{
	std::string textline;
	while(getline(is,textline))
	{
		lines_of_text.push_back(textline);
	}
}

void  TextQuery::build_map()
{
	for(line_no line_num=0;line_num!=lines_of_text.size();++line_num)
	{
		std::istringstream line(lines_of_text[line_num]);
		std::string word;
		while(line>>word)
		{
			int index1=word.find(",");
			int index2=word.find(".");
			int index=index1>index2 ? index1 : index2;
			if(index!=-1)
			{
				word_map[word.substr(0,index)].insert(line_num);
			}
			else
			{
				word_map[word].insert(line_num);
			}
		}
	}
}

std::set<TextQuery::line_no> TextQuery::run_query(const std::string& query_word) const
{
	std::map<std::string,std::set<line_no>>::const_iterator loc=word_map.find(query_word);
	if(loc==word_map.end())
	{
		return std::set<line_no>();
	}
	else
	{
		return loc->second;
	}
}

std::string TextQuery::text_line(line_no line) const
{
	if(line<lines_of_text.size())
	{
		return lines_of_text[line];
	}
	else
	{
		throw std::out_of_range("line number out of range");
	}
}
#endif
// test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <set>
#include "TextQuery.h"
void print_results(const std::set<TextQuery::line_no>& locs, const std::string& sought,const TextQuery& file);

#define FN "cjc.txt"

int main(int argc,char **argv)
{
	std::ifstream infile(FN,std::ios::in);
	if(!infile)
	{
		std::cerr<<"No input file!"<<std::endl;
		return EXIT_FAILURE;
	}
	TextQuery tq;
	tq.read_file(infile);

	while(true)
	{
		std::cout<<"enter word to look for, or q to quit:";
		std::string s;
		std::cin>>s;
		std::cin.get();

		if(!std::cin || s=="q")
		{
			break;
		}

		std::set<TextQuery::line_no> locs=tq.run_query(s);
		print_results(locs,s,tq);
	}

	system("pause");
	return 0;
}

///////////////////////////////////////////////////////////////////////////////////////
std::string make_plural(int size,std::string str1,std::string str2)
{
	if(size>1)
	{
		return str1+str2;
	}
	else
	{
		return str1;
	}
}

void print_results(const std::set<TextQuery::line_no>& locs, const std::string& sought,const TextQuery& file)
{
	typedef std::set<TextQuery::line_no> line_nums;
	line_nums::size_type size=locs.size();

	std::cout<<sought<<" occurs "<<size<<" "
					<<make_plural(size, "time","s")<<std::endl;

	line_nums::const_iterator it=locs.begin();

	for(;it!=locs.end();++it)
	{
		std::cout<<"\t(line "
						<<(*it)+1<<") "
						<<file.text_line(*it)<<std::endl;
	}
	std::cout<<"**********************************************"<<std::endl;
}

时间: 2024-10-11 02:57:03

<<c++ primer>>文本查询程序的相关文章

【足迹C++primer】41、文本查询程序

/** * 功能:使用标准库:文本查询程序 * 时间:2014年7月10日09:10:15 * 作者:cutter_point */ #include<iostream> #include<map> #include<set> #include<fstream> #include<sstream> #include<string> #include<vector> #include<memory> using

【足迹C++primer】56、文本查询程序

/** * 功能:文本查询程序 * 时间:2014年7月23日10:26:09 * 作者:cutter_point */ #include<iostream> #include<algorithm> #include<memory> #include<set> #include<map> #include<fstream> #include<sstream> using namespace std; /* Alice Em

C++自学笔记_文本查询程序_《C++ Primer》

<C++ Primer> 第10章结束,用一个文本查询程序结束本章 :) 程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找单词.查询的结果是该单词出现的次数,并列出每次出现所在的行.如果某单词在同一行 中多次出现,程序将只显示该行一次.行号按照升序显示. 程序支持以下任务: · 它必须允许用户指明要处理的文件的名字.程序将存储该文件的内容,以便输出每个单词所在的原始行. · 它必须将每一行分解为各个单词,并记录每个单词所在的行.在输出行号时,应保证以升序输出,并且不重复. · 对特

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

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

文本查询程序

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

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

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

使用标准库:文本查询程序

使用标准库:文本查询程序 class QueryResult { friend std::ostream& print(std::ostream&,cost QueryResult&); public: Queryresult(std::string s, std::shared_ptr<std::set<line_no>> p, std::shared_ptr<std::vector<std::string>>f): sought(

C++ Primer第四版 15.9 再谈文本查询 程序实现

编程过程中发现书本中的示例程序并不完全,某些地方存在错误,现已改正并添加少许注释.. 1 #include<iostream> 2 #include<fstream> 3 #include<sstream> 4 #include<vector> 5 #include<map> 6 #include<set> 7 #include<algorithm> 8 #include<stdexcept> 9 using

容器的综合应用:文本查询程序

需求 程序读取用户指定的任意文本文件,允许用户从该文件中查找单词.查询结果是该单词出现的次数,并列出每次出现所在行,如果某单词在同一行中多次出现,程序将只显示该行一次.行号按升序显示,即第 7 行应该在第 9 行之前输出,依此类推.例如,以本章的内容作为文件输入,然后查找单词“element”.输出的前几行应为: element occurs 125 times(line 62) element with a given key.(line 64) second element with the