试图在C中查找并替换文件中的字符串

时间:2013-02-24 16:56:39

标签: c

    void replaceString(char* file, char* str, char* replace)
    {
        FILE* fp = fopen(file,"rt");
        char buffer[BUFFER];
        while(fgets(buffer,BUFFER,fp)!=NULL)
        {
            char* s;
            s=strstr(buffer,str);
            if(s!=NULL)
            {
                strcpy(s,replace);
                printf("%s is replaced by %s\n",str,replace);
            }
        }
        fclose(fp);
    }
int main(int argc, char **argv)
{
    char* file= "text.txt";
    replaceString(file,"is","was");
    printFile(file);
    return 0;
}

伙计我是文件操作的新手,试图找到并替换另一个字符串。请帮忙!我试图以“rt”模式打开文件。在一些示例代码中看到了这一点。不确定模式。我猜我需要使用temp.txt文件来做到这一点!可以在一个文件中完成而不使用任何其他文件吗?

4 个答案:

答案 0 :(得分:2)

以下是您算法中的一些错误。

  • 您一次阅读并查看一个字符缓冲区,没有重叠。如果缓冲区之间出现str怎么办? (即str的第一部分位于缓冲区的末尾,第二部分位于下一个缓冲区的开头。)

  • 您尝试使用str直接在缓冲区中使用replace覆盖strcpy。如果两个字符串长度不同怎么办?如果replacestr短,那么str的结尾仍然是replace,如果str更长,则会覆盖strcpy后面的文字

  • 即使它们的长度相同,strncpy也会在副本末尾添加最后的0个字符(这就是它们告诉你字符串结束的方式)。你绝对不希望如此。也许BUFFER在这里是一个更好的建议,但如果两个字符串的长度不同,它仍然无效。

  • 您替换缓冲区中的字符串,但对“已更正”的缓冲区不执行任何操作!缓冲区不是文件,文件的内容被COPIED到缓冲区中。所以你改变了副本然后什么都没改变。该文件不会更改。您需要将更改写入文件,最好是另一个文件。

编写这样的替换并不像你想象的那么简单。我可以尝试帮助你,但如果你只是想学习使用文件并且仍然不熟悉字符串,那可能会有点过头了。

如果你有足够的内存来一次读取整个文件(如果replace大于文件大小),那么在单个文件中执行替换很容易,但是如果不是特别适合{{ {1}}超过str

答案 1 :(得分:1)

此代码替换所有出现的“orig”文本。您可以根据需要进行修改:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

static void
replaceAllString(char *buf, const char *orig, const char *replace)
{
    int olen, rlen;
    char *s, *d;
    char *tmpbuf;

    if (!buf || !*buf || !orig || !*orig || !replace)
        return;

    tmpbuf = malloc(strlen(buf) + 1);
    if (tmpbuf == NULL)
        return;


    olen = strlen(orig);
    rlen = strlen(replace);

    s = buf;
    d = tmpbuf;

    while (*s) {
        if (strncmp(s, orig, olen) == 0) {
            strcpy(d, replace);
            s += olen;
            d += rlen;
        }
        else
            *d++ = *s++;
    }

    *d = '\0';

    strcpy(buf, tmpbuf);
    free(tmpbuf);
}

int
main(int argc, char **argv)
{
    char str[] = "malatya istanbul madrid newyork";

    replaceString(str, "malatya", "ankara");
    printf("%s\n", str);
    replaceString(str, "madrid", "tokyo");
    printf("%s\n", str);

    return 0;
}

答案 2 :(得分:0)

"rt"模式仅供参考。使用"r+"模式。这将打开读写文件。

答案 3 :(得分:0)

我会考虑使用缓冲区并对此进行处理。

#include <stdio.h>
#include <string.h>

int main ( ) {
    char buff[BUFSIZ];      // the input line
    char newbuff[BUFSIZ];   // the results of any editing
    char findme[] = "hello";
    char replacewith[] = "world";
    FILE *in, *out;

    in = fopen( "file.txt", "r" );
    out= fopen( "new.txt", "w" );

    while ( fgets( buff, BUFSIZ, in ) != NULL ) {
        if ( strstr( buff, findme ) != NULL ) {
            // do 1 or more replacements
            // the result should be placed in newbuff
            // just watch you dont overflow newbuff...
        } else {
            // nothing to do - the input line is the output line
            strcpy( newbuff, buff );
        }
        fputs( newbuff, out );
    }

    fclose( in );
    fclose( out );
    return 0;
}