一、运行效果图
二、代码示例
# include <iostream>
# include <fstream>
# include <sstream>
# include <string>
# include <map>
# include <set>
# include <vector>
# include <algorithm>
using namespace std;
class TextQuery {
public :
void readFile ( const string & filename) ;
void query ( const string & word) ;
private :
vector< string> _lines;
map< string, set< int >> _wordsNumbers;
map< string, int > _dict;
} ;
void TextQuery :: readFile ( const string & filename) {
ifstream ifs ( filename) ;
if ( ! ifs. good ( ) ) {
ifs. close ( ) ;
cerr << "open " << filename << " is fail" << endl;
return ;
}
string line;
size_t lineNumber = 0 ;
while ( getline ( ifs, line) ) {
++ lineNumber;
_lines. push_back ( line) ;
istringstream iss ( line) ;
string word;
while ( getline ( iss, word, ' ' ) ) {
word. erase ( remove_if ( word. begin ( ) , word. end ( ) , [ ] ( const char c) {
return ! isalpha ( c) ;
} ) , word. end ( ) ) ;
if ( word. size ( ) == 0 ) {
continue ;
}
++ _dict[ word] ;
auto it = _wordsNumbers. find ( word) ;
if ( it == _wordsNumbers. end ( ) ) {
set< int > numbers;
numbers. insert ( lineNumber) ;
_wordsNumbers[ word] = numbers;
} else {
it-> second. insert ( lineNumber) ;
}
}
}
ifs. close ( ) ;
}
void TextQuery :: query ( const string & word) {
auto dictIt = _dict. find ( word) ;
if ( dictIt == _dict. end ( ) ) {
cout << "\"" << word << "\"" << " never appears!" << endl;
return ;
}
cout << "\"" << word << "\"" << " occurs " << dictIt-> second << ( ( dictIt-> second > 1 ) ? " times" : " time" ) << endl;
auto wordsNumbersIt = _wordsNumbers. find ( word) ;
for ( const auto & lineNumber : wordsNumbersIt-> second) {
cout << lineNumber << ": " ;
istringstream iss ( _lines[ lineNumber - 1 ] ) ;
string tempWord;
while ( getline ( iss, tempWord, ' ' ) ) {
if ( word == tempWord) {
cout << "\033[31m" << tempWord << "\033[0m" << " " ;
} else {
cout << tempWord << " " ;
}
}
cout << endl;
}
}
void test0 ( ) {
TextQuery tq;
tq. readFile ( "./test.txt" ) ;
string word;
while ( cout << "请输入要查询的关键字:" , getline ( cin, word) ) {
tq. query ( word) ;
}
cout << endl;
}
int main ( void ) {
test0 ( ) ;
return 0 ;
}