试图在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文件来做到这一点! 它可以在一个文件中完成而不使用任何其他文件??

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

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

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

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

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

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

如果你有足够的内存来一次读取整个文件(如果BUFFER大于文件大小),那么在单个文件中进行替换很容易,但是如果不是特别是在你的情况下, replacestr长,则非常棘手。

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

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

我会看一下使用缓冲区并对此进行处理。

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

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