#include<iostream>
#include<fstream>
#include<sstream>
#include<memory>
#include<vector>
//#include<map>
#include<set>
//#include<utility>
#include<string>
using namespace std;
typedef unsigned int Line_No;
class TextQuery
{
public:
TextQuery(fstream & fS); //以文件流对象为参数构造文件查询类对象
~TextQuery();
bool query(string dest) ; //查询目标单词
void PrintRes() const; //输出满足query条件单词的行号和内容(相同行只输出一次)
bool OutPutLine(Line_No num) const; //输出指定行内容
private:
vector<string> file_line; //按行存储源文件中的所有内容
string Dest_word; //存储需要查询的目标单词
shared_ptr<multiset<Line_No> >Dest_lineNum; //用以存储目标行号
};
TextQuery::TextQuery(fstream & fs):Dest_lineNum(new multiset<Line_No>)
{
string temp;
if(fs.is_open())
{
while(getline(fs,temp))
file_line.push_back(temp);
}
//cout<<"construction success!"<<endl;//
//cout<<file_line[30]<<endl;//
}
TextQuery::~TextQuery()
{
}
bool TextQuery::query(string dest)
{
Dest_lineNum.reset(new multiset<Line_No>);//释放上次查询的数据内存,使其指向新内存空间
Dest_word=dest;
auto it=file_line.begin();
string word;
Line_No LineNum=1; //用以保存目标单词的行号;
size_t SumWord=0; //用以保存目标单词的总数;
while(it!=file_line.end()) //读取每一行
{
string line=(*it);
istringstream record(line); //将record绑定到每行,每次读取该行一个单词
while(record>>word) //读取每个单词
{
if(word==Dest_word)
{
Dest_lineNum->insert(LineNum);//将目标行号插入关联容器中
SumWord+=1;
continue;
}
}
it++;
LineNum++;
}
cout<<"The sum lines of the file: "<<LineNum<<endl;
return true;
}
void TextQuery::PrintRes() const
{
if(Dest_lineNum->size()==0)
cout<<"The word you are looking for has not appeared in the text!"<<endl;
else
cout<<"The word "<<"'"<<Dest_word<<"'"
<<" occurs "<<Dest_lineNum->size()
<<" time in the file :"<<endl;
set<int> TempSet; //存储目标行号,使相同行号只保存一次
for(auto it=Dest_lineNum->begin();it!=Dest_lineNum->end();it++)
TempSet.insert(*it);
for(auto it=TempSet.begin(); it!= TempSet.end();it++)
cout<<" "<<"(line "<<(*it)<<"):"
<<file_line[(*it)-1]<<endl;
}
bool TextQuery::OutPutLine(Line_No num) const
{
if(num<=0 || num>file_line.size())
{
cout<<"LineNumber is error!"<<endl;
return false;
}
else
{
cout<<"["<<num<<"] "<<file_line[num-1]<<endl;
return true;
}
}
/// 测试该文件查询类///
int main()
{
string FileName="file3.txt";
fstream file(FileName); //构造文件流对象并关联指定文件
TextQuery tq(file);
string word;
while(cin>>word)
{
tq.query(word);
tq.PrintRes();
}
tq.OutPutLine(24);
}