日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文本查询TextQuery类文件编写

發布時間:2024/7/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文本查询TextQuery类文件编写 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讀取用戶指定的任意文本文件,然后允許用戶從該文件中查找單詞。查詢的結果是該單詞出現的次數,并列出每次出現所在的行。如果某單詞在同一行中多次出現,程序將只顯示該行一次。行號按升序顯示,即第 7 行應該在第 9 行之前輸出,依此類推。

textquery.h 頭文件定義文件

#ifndef TEXTQUERY_H //防止重復定義,名稱大寫 #define TEXTQUERY_H #include<map> #include<set> #include<string> #include<fstream> #include<vector>class textquery { public:typedef std::vector<std::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::set<line_no> run_query(const std::string&) const; //聲明查詢函數,返回行號集合set//每一個字符串所在行(返回set<>多個行號) private:void store_file(std::ifstream&); //聲明函數void build_map(); //聲明函數std::vector<std::string> lines_of_text; //定義每一行的文本作為一個元素存在vector里std::map<std::string, std::set<line_no> > word_map; //把每個string和其行號<set> 做成map }; #endif

textquery.cpp 頭文件的實現文件

#include "textquery.h" #include<fstream> #include<sstream> 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實現 set<textquery::line_no> textquery::run_query(const 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>(); //如果找到結尾了,沒找到,返回空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 主函數

#include"textquery.h" #include<iostream> #include<string> #include<stdexcept> #include<fstream> using namespace std;//單詞加后綴函數 string make_plural(size_t ctr, const string &word, const string &ending) {return (ctr == 1)?word:word+ending; //多個單詞,后綴加s }//打印某字符對應所有行的文本函數 void print_results(const set<textquery::line_no> &locs, const string &s, const textquery &file) {typedef set<textquery::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;set<textquery::line_no> locs = tq.run_query(s); //查詢字符串s,返回其所有行號setprint_results(locs,s,tq); //打印tq對象,查詢字符串s下對應所有行的行文本}return 0; }

編譯運行結果

g++ cpp cpp -o exename

總結

以上是生活随笔為你收集整理的文本查询TextQuery类文件编写的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。