您的位置:首页 > 编程语言 > C语言/C++

cpp primer 验证 p325页 文本查讯程序

2010-01-13 12:17 375 查看
头文件:TextQuery.h 

#pragma once
#include <string>
#include <vector>
#include <map>
#include <set>
#include <fstream>
using namespace std;
//文本查讯类
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 &);//store input file
void build_map();
std::vector<std::string> lines_of_text;
std::map<std::string, std::set<line_no> >word_map;
};
 

文件:TextQuery.cpp

#include "TextQuery.h"
#include<sstream>
void TextQuery::store_file(std::ifstream& is )
{
string text_line;
while (getline(is, text_line))
{
lines_of_text.push_back(text_line);
}
}
void TextQuery::build_map()
{
for (line_no line_num = 0;
line_num != lines_of_text.size(); ++line_num)
{
istringstream line(lines_of_text[line_num]);
string word;
while (line >> word)
{
word_map[word].insert(line_num);
}
}
}
std::set<TextQuery::line_no> TextQuery::run_query( const std::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>();  //no fount return empty set
}
else
{
return loc->second;
}
}
std::string TextQuery::text_line( line_no line ) const
{
if (lines_of_text.size())
{
return lines_of_text[line];
}
throw std::out_of_range("line number out of range");
}
 

主函数文件:main.cpp

#include "TextQuery.h"
#include <iostream>
#include <fstream>
using namespace std;

//函数申明
void print_results(const set<TextQuery::line_no> &locs,
const string& sought, const TextQuery& file);
string make_plural(size_t ctr, const string& word, const string& ending);
ifstream& open_file(ifstream& in, const string& file);
int main(int argc, char** argv)
{
ifstream infile;
if (argc < 2 || !open_file(infile, argv[1]))
{
cerr << "No input file!" << endl;
return  -1;//EXIT_FAILURE;
}
TextQuery tq;
tq.read_file(infile);
while (true)
{
cout << "Enter a 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);
print_results(locs, s, tq);
}
}
//print_results
void print_results(const set<TextQuery::line_no> &locs,
const string& sought, const TextQuery& file)
{
typedef set<TextQuery::line_no> line_nums;
line_nums::size_type size = locs.size();
cout << "/n" << sought << "  occurs "
<< size << " "
<< make_plural(size, "time", "s") << endl;
line_nums::const_iterator it = locs.begin();
for ( ; it != locs.end(); ++it)
{
cout << "/t(line"
<< (*it) + 1 << ") " //转化为以1开始的通用形式
<< file.text_line(*it) << endl;
}
}
string make_plural(size_t ctr, const string& word, const string& ending)
{
return (ctr <= 1) ? word : word + ending; //make_plural(wc, "word ", "s ")当输入中文本中
//word数大于一是在word后加s,为words为word的复数!
}
ifstream& open_file(ifstream& in, const string& file)
{
in.close();
in.clear();
in.open(file.c_str());
return in;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息