这个项目的功能主要是:过滤掉文件中的文件编号和金额大小。因为那个是一个中外合资的企业,需要处理的大部分是英文的。
功能是:在文本中找到特征字符串(文件编号前都有一个特征字符串,例如:File:321223344),然后将其文件编号取消掉,换成XXXXXXX。没有特征的话,当然是不作处理。
这就是getneedreplacestring和stringreplace函数了。就是我调试来调试去都出错的函数。功能基本是包括在几个DLL中,上一位同事是用C++写的,现在需要修改一些功能,没办法,学C++拉,结果灰头土脸的。我的思路都写在我的几个帖子上了,不知道是不是错得太多没有信心了。老是胆战心惊。请问大家还有没有什么好的方法和效率更高的方法?

解决方案 »

  1.   

    天呢,原来你做那些就是为了这个功能啊,我晕死了,我前天才帮别人改了个类似的程序,你不用这样,其实你只需要会CString CStdioFile就能做出来了,真是的.....诶!!!!!!!
      

  2.   

    你试试吧,也许没有完全理会你的意思.#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>#define BOOL int
    #define TRUE 1
    #define FALSE 0
    BOOL IsWhite(char cChar)
    {

    return cChar==' ' || cChar=='\t' || cChar=='\r' || cChar=='\n';
    }BOOL IsDelimeter(char cChar)
    {
    return cChar==',' || cChar=='.';
    }//~ Find the substring, change the characters immediately followed
    //~ by the substring into specified characters until a white space
    //~ reached.BOOL ReplaceString(char* szText,char* szSubStr,char cFill)
    {
    if(!szText || !szSubStr)
    return FALSE;

    while(char* ptr=strstr(szText,szSubStr))
    {
    ptr+=strlen(szSubStr);
    while(*ptr && IsWhite(*ptr))
    ptr++; while(*ptr && (!IsWhite(*ptr)) && (!IsDelimeter(*ptr)))
    {
    *ptr=cFill;
    ptr++;
    } szText=ptr;
    } return TRUE;
    }void main()
    {
    char* szText=" this is the test file:111111, i do not known what's going on, file: 22222,this is stop.";
    char cChar='X'; char* ptr=new char[strlen(szText)+1];
    strcpy(ptr,szText);
    ReplaceString(ptr,"file:",cChar); printf("%s\n",ptr);
    delete []ptr;
    }
    (本程序未经测试,使用者后果自负,作者保留所有版权)
      

  3.   

    同意 JennyVenus用perl之类的东西做吧,保证比C/C++快速和简单多了
      

  4.   

    AthlonxpX86(一滴水) 说的很好,你怎么不试试呢我最近刚写了一个程序,也是只使用了CString CStdioFile就可以了东西都是试出来的,测试一下吗!
      

  5.   

    两年多前的系统了,现在是二次开发了,可是可是那个动态链接库包括了SDK呀,要在VC再分开另外一个动态库我是不敢了,听说SDK和MFC混用比较多问题呀,我试了,也真的除了不少问题,CString真的很容易,如果可以用CString ,我用delphi也可以宰了他。
    to szqzy:
    Athlonxpx86是对的,我这种水平用CString不用一个小时也可以完成,对楼上的各位大侠来说更加是简单容易。
      

  6.   

    为什么不用MFC,现在改我估计还来得及
      

  7.   

    //把字符串中的所有的串charlist替换成charReplace,string _replace(const char *str, const string &charlist, const string &charReplace)
    {
    string out = str;

    if(!charlist.empty()) //缺省操作
    {
    int len1 = charlist.size();
    int len2 = charReplace.size();
    size_t beginPos = 0, endPos;
    endPos = out.find(charlist, beginPos);
    while(endPos != size_t(-1))
    {
    out.replace(endPos, len1, charReplace);
    beginPos = endPos + len2;
    endPos = out.find(charlist, beginPos);
    }
    }

    return out;
    }string _replace(const string &str, const string &charlist, const string &charReplace)
    {
    return  _replace(str.c_str(), charlist, charReplace);
    }
      

  8.   

    原来的动态连接库是一个关于SDK方面的东西。我现在写的就是对sdk里面的东西进行扩充。所以我不能用mfc
      

  9.   


    #include <string>
    #include <cassert>
    #include <cstring>
    using namespace std;void getneedreplacestring(const char* source, const char* pattern, string& dest)
    {
    assert(source != NULL && pattern != NULL); int source_length = strlen(source);
    int pattern_length = strlen(pattern); const int REP_LENGTH = 6;
    const char REP_CHAR = 'X'; if (source_length <= 0 || pattern_length <= 0)
    return; bool has_matched = false;
    char ch;
    for (int i = 0, j = 0; i < source_length; )
    {
    ch = source[i];
    if (has_matched)
    {
    if (isdigit(ch))
    {
    // if 'ch' is digital character, increment 'i'
    ++i;
    }
    else
    {
    // for non-digital character, move on for next matching(keep 'i' unchanged)
    has_matched = false;
    j = 0; // reset 'j' for next matching
    }
    }
    else if (j < pattern_length)
    {
    // check for pattern
    if (ch == pattern[j])
    {
    ++j;
    }
    else
    {
    if (j > 0)
    j = 0;
    }
    dest += ch; // append 'ch' to dest
    ++i;
    }
    else
    {
    // match successfully, append "XXXXXX" to dest
    has_matched = true;
    dest.append(REP_LENGTH, REP_CHAR);
    }
    }
    }