//check the word inputed by cin in the "text" file
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<memory>
#include<fstream>
#include<sstream>
class TextQuery{
public:
std::vector<std::string>::size_type line_no;
std::map<std::vector<std::string>::size_type,int> query(std::string keyword,std::shared_ptr<std::vector<std::string>> file);
std::shared_ptr<std::vector<std::string>> save_file(std::ifstream& inputer);
void outputer(std::ostream& output,std::string keyword);
void output_file(std::ofstream& outputf,std::string keyword);
TextQuery(std::string url,std::string keyword);
private:
std::shared_ptr<std::vector<std::string>> file;
std::map<std::vector<std::string>::size_type,int> result;
};
TextQuery::TextQuery(std::string url,std::string keyword){
this->line_no = 0;
std::ifstream inputer(url,std::ifstream::in);
this->file = this->save_file(inputer);
this->result = this->query(keyword,this->file);
}
std::shared_ptr<std::vector<std::string>> TextQuery::save_file(std::ifstream& inputer){
std::shared_ptr<std::vector<std::string>> saver = std::make_shared<std::vector<std::string>>();
std::string temp;
while(getline(inputer,temp)){
saver->push_back(temp);
line_no ++;
}
return saver;
}
std::map<std::vector<std::string>::size_type,int> TextQuery::query(std::string keyword,std::shared_ptr<std::vector<std::string>> file){
std::vector<std::string>::size_type count = 0;
std::string temp;
std::map<std::vector<std::string>::size_type,int> result;
auto ite1 = file->cbegin(), ite2 = file->cend();
while(ite1 != ite2 ){
std::istringstream str_input(*ite1);
while(str_input >> temp){
if(temp == keyword){
if(result.find(count) == result.cend()) result.insert(std::make_pair(count,1));
else
result[count]++;
}
}
ite1 ++;
count ++;
}
return result;
}
void TextQuery::outputer(std::ostream& output,std::string keyword){
int sum = 0;
auto ite1 = this->result.cbegin();
auto ite2 = this->result.cend();
while(ite1 != ite2){
sum += ite1->second;
ite1 ++;
}
output << keyword << " occurs "<<sum<<" times"<<'\n';
ite1 = this->result.cbegin();
while(ite1 != ite2){
if(ite1->second == 1 ){
output<<"("<< ite1->second << " time in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
}
else{
output<<"("<< ite1->second << " times in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
}
ite1 ++;
}
}
void TextQuery::output_file(std::ofstream& outputf,std::string keyword){
int sum = 0;
auto ite1 = this->result.cbegin();
auto ite2 = this->result.cend();
while(ite1 != ite2){
sum += ite1->second;
ite1 ++;
}
outputf << keyword << " occurs "<<sum<<" times"<<'\n';
ite1 = this->result.cbegin();
while(ite1 != ite2){
if(ite1->second == 1 ){
outputf<<"("<< ite1->second << " time in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
}
else{
outputf<<"("<< ite1->second << " times in line " << ite1->first <<") "<< file->at(ite1->first)<<'\n';
}
ite1 ++;
}
}
int main(){
std::string keyword;
std::cin >> keyword;
std::string url = "./text"; //the file name
TextQuery query(url,keyword);
std::ofstream outputf("./textquery",std::ofstream::out);//output in "textquery"
query.output_file(outputf,keyword);
}
没有评论:
发表评论