Tratando de encontrar y reemplazar una cadena de archivo en 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; } 

Chicos Soy nuevo en las operaciones de archivos, tratando de encontrar y reemplazar una cadena por otra. ¡por favor ayuda! Estoy tratando de abrir el archivo en modo “rt”. Vio esto en algún código de ejemplo. No estoy seguro sobre el modo. ¡Supongo que necesito usar un archivo temp.txt para hacer eso! ¿Se puede hacer en un solo archivo sin usar ningún otro archivo?

Éstos son algunos de los errores en su algoritmo.

  • Lees y miras a un BUFFER de caracteres a la vez, sin superposición. ¿Qué pasa si str aparece entre buffers? (Es decir, la primera parte de str está al final de un búfer y la segunda parte está al comienzo del siguiente búfer).

  • Intenta sobrescribir str con replace directamente en el búfer usando strcpy . ¿Qué pasa si ambas cuerdas son de diferente longitud? Si replace es más corto que str , todavía tendrías el final de str y si replace es más largo, sobrescribirá el texto que sigue a str

  • Incluso si tienen la misma longitud, strcpy agrega el carácter 0 final al final de la copia (así es como te dicen dónde terminó la cadena). Definitivamente no quieres eso. Quizás strncpy sea ​​una sugerencia mejor aquí, aunque aún no funcionará si ambas cadenas no tienen la misma longitud.

  • ¡Reemplaza las cadenas en el búfer pero no hace nada con el búfer “corregido”! El búfer no es el archivo, el contenido del archivo se COPIÓ en el búfer. Así que cambiaste la copia y luego nada. El archivo no cambiará. Necesita escribir sus cambios en un archivo, preferiblemente uno diferente.

Escribir un reemplazo así no es tan trivial como podrías pensar. Puedo intentarlo y ayudarlo, pero es posible que esté un poco por encima de su cabeza si solo está tratando de aprender a trabajar con archivos y aún no se siente cómodo con las cadenas.

Hacer el reemplazo en un solo archivo es fácil si tiene suficiente memoria para leer todo el archivo a la vez (si BUFFER es más grande que el tamaño del archivo), pero es muy difícil, especialmente si su replace es más largo que el de str .

Este código reemplaza todas las apariciones del texto ‘orig’. Puedes modificarlo según tu necesidad:

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

Me gustaría usar un búfer y trabajar en esto.

 #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" es solo para lectura. Utilice el modo "r+" . Eso abre el archivo para leer y escribir.