?? 指定文件字符串查找.cpp
字號:
#include <iostream>//標準I/O類
#include <string>//字符串類
#include <algorithm>//STL 通用算法,各種對容器的操作
#include <iterator>//為了使用輸入輸出迭代器
#include <fstream>//輸入輸出文件
using namespace std;//用namespace std確保正確使用cout。
class linestring : public string{};//類名,既說明部分開始
inline istream& operator >>( istream& in, linestring& rch )
//內聯(lián)函數(shù)
//輸入運算符>>往往需要支持同時輸入到多個目標中,要用到istream
{return getline( in, rch );
}
struct SmileOnce//結構名
{void operator()( const string& line )
{ ++linenum;
string::const_iterator p = search(line.begin(),line.end(),str.begin(),str.end());//搜索
if( p!=line.end() )
{ cout << "LINE " << linenum << ": " << (p-line.begin()+1);//行
++num;
p+=str.length();
for( ;(p=search(p,line.end(),str.begin(),str.end()))!=line.end(); advance(p,str.length()) )
{ cout << ',' << (p-line.begin()+1);//列
++num;//統(tǒng)計個數(shù)
}
cout << endl;
}
}
SmileOnce( const string& s,size_t& n ) : str(s),linenum(0),num(n) {}
private://class的默認訪問權限,私有成員,僅在類體內可見,僅可被類體內的成員函數(shù)所訪問。
const string& str;
size_t linenum;
size_t& num;
};//說明部分結束
//實現(xiàn)部分
int main( int argc, char *argv[] )
{
// 已知條件
string filename;
cout<<"請輸入要查找的文件路徑: "<<endl;
cin>>filename;
ifstream file( filename.c_str());
// ifstream file(filename.c_str())就是構造了一個ifstream的實例
//文件處理部分
if(!file.is_open())
{
cout<<"不能打開文件"<<endl;
return -1;
}
cout<<"文件存在,已打開…"<<endl;
printf("\n請輸入您要查找的字符:\n");
char str[20];
cin>>str;
// 開始處理
while(str[0] != '!')//建立循環(huán)實現(xiàn)多次查找
{
size_t num = 0;
ifstream file( filename.c_str());
for_each( istream_iterator<linestring>(file),istream_iterator<linestring>(),SmileOnce(str,num) );
//for_each()算法將SmileOnce(str,num)應用于istream_iterator<linestring>(file)和istream_iterator<linestring>()指定范圍內的元素,它返回SmileOnce(str,num)
//istream_iterator這是一個迭代器,是輸入流的迭代器
cout << "共找到" << num << "處." << endl;
printf("\n請輸入您要查找的字符,結束查找可輸入'!' :\n");
cin>>str;
}
system("PAUSE"); //輸出"請按任意鍵繼續(xù). . ."
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -