/*************************************************************************
> File Name: Query.h
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时46分18秒
************************************************************************/
#ifndef _QUERY_H
#define _QUERY_H
#include<fstream>
#include<vector>
#include<string>
#include<sstream>
#include<map>
#include<set>
using namespace std;
class TextQuery
{
public:
TextQuery(std::ifstream &); //构造函数
TextQuery read(ifstream &file,TextQuery &item); //读输入文件
void print(); //打印读入的文件
void account(ifstream &file); //根据输入流将key值和value统计输入map
void query(string &s); //根据单词s打印出所在行
void map_print(); //打印map的key值
private:
vector<string> vec; //用来保存输入的每一行
map<string,set<int>> word_map; //每个单词作为key,行号的set集作为value
};
void TextQuery::map_print() //打印出现的单词
{
auto ret=word_map.begin();
while(ret!=word_map.cend())
{
cout<<ret->first<<" ";
++ret;
}
}
void TextQuery::query(string &s) //根据输入的单词s,打印出所在行
{
auto ret=word_map.find(s);
if(ret!=word_map.cend())
{
auto set_it=(ret->second).cbegin();
while(set_it!=(ret->second).cend())
{
cout<<*set_it<<" "<<vec[*set_it-1]<<endl;
++set_it;
}
}
else
cout<<"could't find";
}
void TextQuery::account(ifstream &file)
{
string fline,word;
int line_num=0;
while(getline(file,fline))
{
++line_num;
istringstream record(fline); //将一行绑定到record流,分解成单词
while(record>>word)
{
auto ret=word_map.find(word);
if (ret!=word_map.cend()) //若该单词已经在map的key值出现,则插入行号
{
ret->second.insert(line_num);
}
else //若未出现,则插入key和对应的value
{
set<int> val={line_num};
word_map.insert(make_pair(word,val));
}
}
}
}
void TextQuery::print() //打印出vec中的内容
{
for(auto c:vec)
cout<<c<<endl;
}
TextQuery TextQuery::read(std::ifstream &file,TextQuery &item)
{
string line;
if(file) //如果打开成功,读入每一行
{
while(getline(file,line))
{
(item.vec).push_back(line);
}
}
else
cerr<<"could't open";
file.close();
return item;
}
TextQuery::TextQuery(std::ifstream &file)
{
read(file,*this); //read读入初始化vec
map<string,set<int>> word_map;
}
#endif
/*************************************************************************
> File Name: Query.cpp
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时38分07秒
************************************************************************/
#include<iostream>
#include<fstream>
#include"Query.h"
using namespace std;
int main()
{
ifstream file("storyDataFile");
TextQuery item(file);
item.print();
file.close(); //关闭file流
ifstream file2("storyDataFile"); //重新打开那个文件
item.account(file2);
cout<<"Enter the word you want to find "<<endl;
string s;
cin>>s;
item.query(s);
// item.map_print();
return 0;
}
/*
void runQueries(ifstream &infile);
void runQueries(ifstream &infile)
{
//infile是一个ifstream,指向我们要处理的文件
Text tq(infile); //保存建立并打印结果
while(true)
{
cout<<"enter word to look for,or q to quit: ";
string s;
if(!(cin>>s)||s=="q") break;
print(cout,tq.query(s))<<endl;
}
}
*/