|
|
所犯错误:istream_iterator<linestring>(file)迭代的是字符串,而不是文件中的行,需要自己写一个linestring和对应的istream& operator >>( istream& in, linestring& rch )
完整源代码如下,经VC++6.0和DevC++4948编译运行测试通过
#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
#include <fstream>
using namespace std;
class linestring : public string{};
inline istream& operator >>( istream& in, linestring& rch )
{
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:
const string& str;
size_t linenum;
size_t& num;
};
int main( int argc, char *argv[] )
{
// 已知条件
string filename = "D:\\test.txt";
string str = "abc";
// 开始处理
size_t num = 0;
ifstream file( filename.c_str() );
for_each( istream_iterator<linestring>(file),istream_iterator<linestring>(),SmileOnce(str,num) );
cout << "共找到" << num << "处." << endl;
system( " AUSE" );
return 0;
}
|
|