c++文本查询类设计

本文介绍了一个使用C++实现的文本查询类,该类能够读取文件内容,按行存储,并提供查询特定单词及其出现行号的功能。类的成员包括存储文件行的向量、目标单词和存储目标行号的多集合。通过查询方法,可以查找并输出目标单词的行号和内容,同时提供打印指定行内容的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<fstream>
#include<sstream>
#include<memory>
#include<vector>
//#include<map>
#include<set>
//#include<utility>
#include<string>
using namespace std;
typedef unsigned int Line_No;

class TextQuery
{
public:
    TextQuery(fstream & fS); //以文件流对象为参数构造文件查询类对象
    ~TextQuery();  
    bool query(string dest) ; //查询目标单词
     void PrintRes() const;      //输出满足query条件单词的行号和内容(相同行只输出一次)
    bool OutPutLine(Line_No num) const; //输出指定行内容
private:
    vector<string> file_line;   //按行存储源文件中的所有内容
    string Dest_word;        //存储需要查询的目标单词
    shared_ptr<multiset<Line_No> >Dest_lineNum; //用以存储目标行号
}; 

TextQuery::TextQuery(fstream & fs):Dest_lineNum(new multiset<Line_No>)
{
    string temp;
    if(fs.is_open())
    {
        while(getline(fs,temp))
              file_line.push_back(temp);
    }
    //cout<<"construction success!"<<endl;//
    //cout<<file_line[30]<<endl;//
}
TextQuery::~TextQuery()
{

}

bool TextQuery::query(string dest)
{
    Dest_lineNum.reset(new multiset<Line_No>);//释放上次查询的数据内存,使其指向新内存空间
    Dest_word=dest;
    auto it=file_line.begin();
    string word;
    Line_No LineNum=1;  //用以保存目标单词的行号;
    size_t SumWord=0; //用以保存目标单词的总数;

    while(it!=file_line.end()) //读取每一行
    {
        string line=(*it);
        istringstream record(line);  //将record绑定到每行,每次读取该行一个单词
        while(record>>word)   //读取每个单词
        {
            if(word==Dest_word) 
            {
                Dest_lineNum->insert(LineNum);//将目标行号插入关联容器中
                SumWord+=1; 
                continue;
            }
        }
        it++;
        LineNum++;
    }
    cout<<"The sum lines of the file: "<<LineNum<<endl;
    return true;
}

void TextQuery::PrintRes() const
{
    if(Dest_lineNum->size()==0)
        cout<<"The word you are looking for has not appeared in the text!"<<endl;
    else
        cout<<"The word "<<"'"<<Dest_word<<"'"
              <<" occurs "<<Dest_lineNum->size()
                 <<" time in the file :"<<endl;
    set<int> TempSet;   //存储目标行号,使相同行号只保存一次
    for(auto it=Dest_lineNum->begin();it!=Dest_lineNum->end();it++)
        TempSet.insert(*it);
    for(auto it=TempSet.begin(); it!= TempSet.end();it++)
        cout<<"  "<<"(line "<<(*it)<<"):"
             <<file_line[(*it)-1]<<endl;          
}
 
bool TextQuery::OutPutLine(Line_No num) const
{
    if(num<=0 || num>file_line.size())
    {
        cout<<"LineNumber is error!"<<endl;
        return false;
    }
    else
    {
        cout<<"["<<num<<"]  "<<file_line[num-1]<<endl;
        return true;
    }
}

/// 测试该文件查询类///
int main()
{
    string FileName="file3.txt";
    fstream file(FileName); //构造文件流对象并关联指定文件
    TextQuery tq(file);
    string word;
    while(cin>>word) 
    {
        tq.query(word);
        tq.PrintRes();
    }
    tq.OutPutLine(24);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值