2013-02-24 92 views
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文件来做到这一点!可以在单个文件中完成而不使用任何其他文件?试图找到并替换文件中的字符串C

+2

只有更换为相同的长度,它替换的字符串。你需要阅读'fseek'和'fwrite'。 – 2013-02-24 16:58:23

+0

有人可以提供源代码来做到这一点? – 2013-02-24 17:34:50

+6

SO的原理是,你问问题可以给出合理的答案,并可以帮助其他人。 “你能提供源代码来做到这一点吗?”在某种意义上非常容易,“是的,我可以,但我不会!” - 但这对其他人没有任何帮助! – 2013-02-24 19:07:21

回答

0

"rt"模式仅供阅读。使用"r+"模式。这将打开读取和写入文件。

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; 
} 
+0

如果在缓冲区之间出现findme,该怎么办?你会错过它然后... – rabensky 2013-07-25 06:00:13

2

这是您的算法中的一些错误。

  • 你读,并期待在一个缓冲区字符的同时,有没有重叠。 str在缓冲区之间出现怎么办? (即,str的第一部分位于缓冲器的末尾,第二部分位于下一缓冲器的开始位置)。

  • 您尝试使用strcpy直接在缓冲区中用replace覆盖str。如果两个琴弦的长度不同,会怎么样?如果replacestr短,你仍旧有str有结束,如果replace较长,它将覆盖以下str

  • 即使它们是相同长度的文本,strcpy增加了最终的0字符在副本的结尾(这是他们如何告诉你字符串结束的位置)。你明确地不想要那个。也许strncpy是一个更好的建议,但如果两个字符串的长度不一样,它仍然不起作用。

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

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

做在一个单一的文件替换是容易的,如果你有足够的内存读取整个文件一次(如果BUFFER比文件大小),但如果没有特别的情况非常棘手,其中replace长于str

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; 
}