关闭

简化版文本查询类

435人阅读 评论(0) 收藏 举报
分类:












/*



*/
class TextQuery
{
    public:
        typedef string::size_type str_size;
        typedef vector<string>::size_type line_no;
        void read_file(ifstream &is)
        {
           store_file(is); 
           build_map();
        }
        string text_line(line_no line) const
        {
            if(line<line_of_text.size())
                return line_of_text[line];     
            throw out_of_range("line number out of range");
        }
        set<line_no> run_query(const string& query_word) const;
    private:
        void TextQuery::store_file(ifstream& is)
        {
            string textline;
            while(getline(is, textline))
                line_of_text.push_back(textline);
        }

        void build_map()
        {
            for(line_no line_num=0;
                    line_num!=line_of_text.size();
                    ++line_num)
            {
               istringstream line(line_of_text[line_num]); 
               string word;
               while(line>>word)
                   word_map[cleanup_str(word)].insert(line_num);
            }	            
        }
        static string cleanup_str(const string& word)
        {
            string ret;
            for(string::const_iterator it=word.begin();
                    it!=word.end();
                    ++it)
            {
                if(!ispunct(*it))    
                    ret+=tolower(*it);
            }	
            return ret;
        }
        vector<string> line_of_text; 
        map<string,set<line_no> > word_map;
};

set<TextQuery::line_no> 
TextQuery::run_query(const string& query_word) const
{
	string subword(query_word);
    map<string,set<line_no> >::const_iterator
        it=word_map.find(cleanup_str(subword));
    if(it==word_map.end())
        return set<line_no>(); 
    else
        return it->second;
}

void print_results(const set<TextQuery::line_no>& result,
        const string& querytext,const TextQuery &tq)
{
    typedef set<TextQuery::line_no> lines;
    lines::size_type size=result.size();
    cout<<endl<<querytext<<" occurs "
        <<size<<(size>1?" time ":" times ")<<endl; 
    for(lines::const_iterator it=result.begin();
            it!=result.end();
            ++it)
    {
        stringstream istr;
		istr<<"\t"<<"line("<<((*it)+1)<<")";
        cout<<setw(10)<<left<<istr.str();
        cout<<setw(10)<<left<<tq.text_line(*it)<<endl;
    }
    

}

int main(int argc, const char *argv[])
{
    ifstream infile;
    string filename(__FILE__);
    infile.close();
    infile.clear();
    infile.open(filename.c_str());
    TextQuery tq;
    tq.read_file(infile);
    string query_word;
    set<TextQuery::line_no> result;
    while(cin>>query_word && query_word!="q" )
    {
        result=tq.run_query(query_word);
        print_results(result,query_word, tq);
    }
        
    system("pause");
    return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:40525次
    • 积分:658
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:28篇
    • 译文:0篇
    • 评论:0条
    文章分类