游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1092|回复: 0

我曾犯过的错误01—在给定文件中查找给定字符串的位置

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2004-11-19 20:17:00 | 显示全部楼层 |阅读模式
所犯错误: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( &quotAUSE" );
    return 0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 09:03

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表