1
    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

4 回答 4

2

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

#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;
}
于 2013-11-14T07:30:00.147 回答
2

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

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

  • 您尝试str使用replace直接在缓冲区中覆盖strcpy. 如果两个字符串的长度不同怎么办?如果replace比 短str,你仍然有结尾,str如果replace更长,它将覆盖下面的文本str

  • 即使它们的长度相同,strcpy也要在副本末尾添加最后一个 0 字符(这就是他们告诉您字符串在哪里结束的方式)。你绝对不想要那个。也许strncpy在这里是一个更好的建议,尽管如果两个字符串的长度不同,它仍然不起作用。

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

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

BUFFER如果您有足够的内存一次读取整个文件(如果大于文件大小),则在单个文件中进行替换很容易,但如果不是特别是在您的情况下,replace则非常棘手,其中str.

于 2013-07-25T05:57:32.870 回答
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;
}
于 2013-07-25T05:39:31.477 回答
0

"rt"模式是只读的。使用"r+"模式。这将打开文件进行读写。

于 2013-07-25T05:30:33.077 回答