在指定文本中查询指定字符串

来源:互联网 发布:辐射4 室内光源优化 编辑:程序博客网 时间:2024/06/08 03:26
/*2014/2/28 10:13
 *功能:主要用于文本文件中字符串的查找
 *作者:CxDtreeg
 */
#include<iostream>
#include"fstream"
#include"string"
#include"windows.h"
#include"vector"
#include"map"
#include"set"
#include"time.h"
#include"algorithm"
#include"sstream"
#include"utility"
using namespace std;
class TextQuery
{
public:
    bool Import(ifstream &file,string &filename);
    void MyFind(string &);
private:
    vector<string> text;
};
bool TextQuery::Import(ifstream &file,string &filename)
{
    file.open(filename.c_str());
    if(!file)
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x4);
        cout<<"没有这个文件!"<<endl;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x7);
        return false;
    }
    while(!file.eof())
    {
        string s;
        getline(file,s);
        text.push_back(s);
    }
    file.close();
    return true;
}
void TextQuery::MyFind(string &QueryWord)
{
    int total=0;
    for(vector<string>::size_type i=0; i!=text.size(); ++i)
    {
        vector<string>::size_type wei=text[i].find(QueryWord);
        if(wei!=string::npos)
        {
            ++total;
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x3);
            cout<<"(lines "<<i+1<<")  ";
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x7);
            vector<string>::size_type tou=0;
            while(wei!=string::npos)
            {
                cout<<text[i].substr(tou,wei-tou);
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x6);
                cout<<text[i].substr(wei,QueryWord.size());
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x7);
                tou=wei+QueryWord.size();
                wei=text[i].find(QueryWord,tou);
                if(wei==string::npos)
                    cout<<text[i].substr(tou)<<endl;
            }
        }
    }
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x3);
    cout<<"查询到"<<total<<"条结果。 ";
}
void run(char *argv[],int argc)
{
    string filename,QueryWord;
    TextQuery TeW;
    clock_t start,stop;
    ifstream file;
    if(argc==1)
    {
        cout<<"请输入文件名:"<<endl;
        cin>>filename;
        cout<<"请输入查找的词:"<<endl;
        cin>>QueryWord;
    }
    else if(argc==3)
    {
        filename=argv[1];
        QueryWord=argv[2];
    }
    else
    {
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x4);
        cout<<"格式错误!正确格式:查询程序 文件名 要查询的字符串"<<endl;
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x7);
        return;
    }
    start=clock();
    if(!TeW.Import(file,filename))
        return ;
    TeW.MyFind(QueryWord);
    stop=clock();
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|0x3);
    cout<<"查询用时:"<<stop-start<<"ms"<<endl;
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x7);
}
int main(int argc,char *argv[])
{
    run(argv,argc);
    return 0;
}

0 0
原创粉丝点击