C++自学笔记_文本查询程序_《C++ Primer》
生活随笔
收集整理的這篇文章主要介紹了
C++自学笔记_文本查询程序_《C++ Primer》
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
《C++ Primer》 第10章結束,用一個文本查詢程序結束本章 :)
?
程序將讀取用戶指定的任意文本文件,然后允許用戶從該文件中查找單詞。查詢的結果是該單詞出現的次數,并列出每次出現所在的行。如果某單詞在同一行
中多次出現,程序將只顯示該行一次。行號按照升序顯示。
?
程序支持以下任務:
· 它必須允許用戶指明要處理的文件的名字。程序將存儲該文件的內容,以便輸出每個單詞所在的原始行。
· 它必須將每一行分解為各個單詞,并記錄每個單詞所在的行。在輸出行號時,應保證以升序輸出,并且不重復。
· 對特定單詞的查詢將返回出現該單詞的所有行的行號。
· 輸出某單詞所在的行文本時,程序必須能夠根據給定的行號從輸入文件中獲取相應的行。
?
假定要查詢的文件路徑為 ?F:\C++ Primer_TXT\TextQuery.txt
TextQuery.txt:
?
Code: #include <iostream> #include <vector> #include <map> #include <set> #include <fstream> #include <sstream> #include <stdexcept>using namespace std;class TextQuery{ public:typedef vector<string>::size_type line_no;void read_file(ifstream &is){store_file(is);build_map();}set<line_no> run_query(const string&) const;string text_line(line_no) const; private:void store_file(ifstream &);void build_map();vector<string> lines_of_text;map<string,set<line_no> >word_map; };/*存儲輸入文件*/ void TextQuery::store_file(ifstream &is){string textline;while(getline(is,textline)){lines_of_text.push_back(textline);} }/*建立map容器*/ void TextQuery::build_map(){for(line_no line_num=0;line_num!=lines_of_text.size();++line_num){istringstream line(lines_of_text[line_num]);string word;while(line>>word){word_map[word].insert(line_num);}} }/*支持查詢*/ 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>();elsereturn loc->second; }/*run_query返回值的使用*/ string TextQuery::text_line(line_no line) const{if(line<lines_of_text.size())return lines_of_text[line];elsethrow out_of_range("line number out of range"); }string make_plural(TextQuery::line_no ctr,const string &word,const string &ending){return (ctr==1)? word:word+ending; }void print_results(const set<TextQuery::line_no>& locs,const string& sought,const TextQuery &file){typedef set<TextQuery::line_no> line_nums;line_nums::size_type size=locs.size();cout<<"\n"<<sought<<" occurs "<<size<<make_plural(size," time","s")<<endl;line_nums::const_iterator it=locs.begin();for( ;it!=locs.end();++it){cout<<"\t(line "<<(*it)+1<<") "<<file.text_line(*it)<<endl;} }int main() {ifstream infile;cout<<"enter a file path to query: ";string fileName;getline(cin,fileName);infile.open(fileName.c_str());TextQuery tq;tq.read_file(infile);while(true){cout<<endl<<"enter a word to look for,or q to quit: ";string str;cin>>str;if(!cin||str=="q")break;set<TextQuery::line_no> locs=tq.run_query(str);print_results(locs,str,tq);}return 0; }?
轉載于:https://www.cnblogs.com/Murcielago/p/4164863.html
總結
以上是生活随笔為你收集整理的C++自学笔记_文本查询程序_《C++ Primer》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CAS实现单点登录(SSO)经典完整教程
- 下一篇: 欚河公交车站去大统华坐几路车?