星月教你做网站,汽车网站模板免费下载,网站建设管理自查工作总结,宝塔面板 wordpress读取用户指定的任意文本文件#xff0c;然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数#xff0c;并列出每次出现所在的行。如果某单词在同一行中多次出现#xff0c;程序将只显示该行一次。行号按升序显示#xff0c;即第 7 行应该在第 9 行之前输出然后允许用户从该文件中查找单词。查询的结果是该单词出现的次数并列出每次出现所在的行。如果某单词在同一行中多次出现程序将只显示该行一次。行号按升序显示即第 7 行应该在第 9 行之前输出依此类推。
textquery.h 头文件定义文件
#ifndef TEXTQUERY_H //防止重复定义名称大写
#define TEXTQUERY_H
#includemap
#includeset
#includestring
#includefstream
#includevectorclass textquery
{
public:typedef std::vectorstd::string::size_type line_no;void read_file(std::ifstream is) //定义函数读取文件{store_file(is); //调用函数把打开的文件流存入文件build_map(); //调用函数生成map容器}std::string text_line(line_no) const; //声明 行文本函数std::setline_no run_query(const std::string) const; //声明查询函数返回行号集合set//每一个字符串所在行返回set多个行号
private:void store_file(std::ifstream); //声明函数void build_map(); //声明函数std::vectorstd::string lines_of_text; //定义每一行的文本作为一个元素存在vector里std::mapstd::string, std::setline_no word_map; //把每个string和其行号set 做成map
};
#endiftextquery.cpp 头文件的实现文件
#include textquery.h
#includefstream
#includesstream
using namespace std;//store_file函数实现
void textquery::store_file(ifstream is)
{string textline;while(getline(is,textline)) //从文件流 is中获取每一行的文本存成 n行个元素的 vectorlines_of_text.push_back(textline);
}//build_map函数实现
void textquery::build_map()
{for(line_no line_num 0; line_num ! lines_of_text.size(); line_num) //遍历 n行{istringstream line(lines_of_text[line_num]); //定义字符串流line绑定每行的文本string word;while(line word) //把字符串流line里的每个字符串word和其行号line_num存成mapword_map[word].insert(line_num);}
}//查询函数run_query实现
settextquery::line_no textquery::run_query(const string query_word) const
{mapstring, setline_no ::const_iterator loc word_map.find(query_word);//找到被查询单词的迭代器if(loc word_map.end())return setline_no(); //如果找到结尾了没找到返回空setelsereturn loc-second; //如果找到了返回迭代器指向对象的第二元素 set行号集合
}//文本行 text_line函数返回某行的文本
string textquery::text_line(line_no line) const
{if(line lines_of_text.size()) //如果行号没有超出范围返回vector里的某个元素一行文本return lines_of_text[line];throw std::out_of_range(line number out of range); //行号超出则抛出异常
}main_textquery.cpp 主函数
#includetextquery.h
#includeiostream
#includestring
#includestdexcept
#includefstream
using namespace std;//单词加后缀函数
string make_plural(size_t ctr, const string word, const string ending)
{return (ctr 1)?word:wordending; //多个单词后缀加s
}//打印某字符对应所有行的文本函数
void print_results(const settextquery::line_no locs, const string s, const textquery file)
{typedef settextquery::line_no line_nums;line_nums::size_type size locs.size(); //字符串的行号有多少个cout \n s occurs size make_plural(size, time, s) endl;line_nums::const_iterator it locs.begin();for(;it ! locs.end();it) //遍历行号set{cout \t(line (*it)1 ) file.text_line(*it) endl;//输出每个行号对应的文本}
}
int main(int argc, char **argv)
{if(argc 2) //判断输入文本名称参数没有{cerr No input file! endl;return EXIT_FAILURE;}ifstream infile;infile.open(argv[1]);if(!infile) //判断文件打开了没有{cerr can not open input file! endl;return EXIT_FAILURE;}textquery tq; //定义文本查询对象tqtq.read_file(infile); //读取文件存储生成map数据库while(true){cout enter word to look for, or q to quit: ;string s;cin s;if(!cin || s q)break;settextquery::line_no locs tq.run_query(s); //查询字符串s返回其所有行号setprint_results(locs,s,tq); //打印tq对象查询字符串s下对应所有行的行文本}return 0;
}编译运行结果
g cpp cpp -o exename