📄 指定文件字符串查找.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 )
//内联函数
//输入运算符>>往往需要支持同时输入到多个目标中,要用到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;//统计个数
}
cout << endl;
}
}
SmileOnce( const string& s,size_t& n ) : str(s),linenum(0),num(n) {}
private://class的默认访问权限,私有成员,仅在类体内可见,仅可被类体内的成员函数所访问。
const string& str;
size_t linenum;
size_t& num;
};//说明部分结束
//实现部分
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] != '!')//建立循环实现多次查找
{
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"); //输出"请按任意键继续. . ."
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -