Chinaunix首页 | 论坛 | 博客
  • 博客访问: 990989
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-16 10:31:33

题目要求:在给定文件中查找给定字符串的位置和数目
所犯错误:istream_iterator(file)迭代的是字符串,而不是文件中的行,需要自己写一个linestring和对应的istream& operator >>( istream& in, linestring& rch )

完整源代码如下,经VC++6.0和DevC++4948编译运行测试通过

#include
#include
#include
#include
#include
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(file),istream_iterator(),SmileOnce(str,num) );
    cout << "共找到" << num << "处." << endl;

    system( "PAUSE" );
    return 0;
}
阅读(1115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~