Cómo reemplazar el texto en una ubicación particular de un archivo al pasar el argumento a través del argumento de la línea de comandos

Mi intención es leer el segundo elemento en la primera fila y reemplazarlo con el valor que pasamos como argumento de línea de comando y reemplazarlo en el archivo input.txt

Archivo de entrada: logic.txt

uno = 1234

dos = 3456

Quiero que mi archivo se modifique de esta manera después de comstackr el código.

./a.out 1567

Actualmente estoy obteniendo una salida como esta

./filelogic 1567

1567 = 1234

dos = 5678

El archivo de salida esperado debe modificarse así después de la comstackción

logic.txt

uno = 1567

dos = 5678

char buf[MAXSIZE] = {}; int num = 0; int i = 0; num = atoi(argv[1]); printf("%d",num); FILE *fp1; fp1 = fopen("logic.txt","r");//currently reading the file. if(fp1 != NULL) { fseek(fp1,3,0);//Need to Move the pointer to the 3rd position where i need to replace the num(fseek(fp1,??,0))-->how we can achieve that. //Using which method i can replace the num value into a file (means need to replace 1234 inplace of 1567) //Once the changes are done need to replace in the same file. fread(buf, 1, MAXSIZE, fp1); printf("%s\n",buf); fclose(fp1); }else { printf("Cannot open file""); exit(1); } 

¿Alguien podría guiarme para resolver este problema? Gracias de antemano

Puede hacer reemplazos a un archivo en el lugar , pero no debe hacer esto en la práctica. Es probable que corrompa el archivo si intentas reemplazar los caracteres y no haces un reemplazo uno a uno de los caracteres ya existentes en el archivo.

Para cambiar de forma segura el contenido de un archivo, lea el contenido completo del archivo en la memoria, haga los cambios necesarios y luego trunca el archivo actual y escriba el nuevo contenido en el archivo truncado. (Si el archivo es demasiado grande para operaciones en memoria, entonces use un archivo temporal)

No desea utilizar atoi para convertir la cadena "1567" en un entero. Está reemplazando caracteres en un archivo, no valores enteros en un archivo binario, así que trabaje con caracteres en su lugar.

Su proyecto se complica al solo querer reemplazar el texto después del primer signo '=' . Esto puede o no puede estar en la primera línea del archivo, por lo que necesitará algún indicador para indicar cuándo se encuentra el primer '=' y se hace el reemplazo. (una vez que se realiza el reemplazo, simplemente puede romper su ciclo de lectura y cerrar el archivo, pero debajo del ejemplo, se muestran todas las líneas para su comodidad)

Cada vez que cierre un archivo después de escribir en él, debe validar la devolución de fclose para detectar cualquier error de transmisión o los errores que se produjeron en la última escritura y que no serán evidentes hasta la siguiente operación de archivo.

Con esas precauciones y advertencias en mente, podrías hacer algo similar a:

 #include  #include  #define MAXSIZE 64 /* max line/buffer size */ #define FNAME "logic.txt" /* default file name */ #define REPLACE "1567" /* default replacement text */ int main (int argc, char **argv) { char buf[MAXSIZE] = ""; /* line buffer */ const char *str = argc > 1 ? argv[1] : REPLACE; /* replacement string */ int replaced = 0; /* flag indicating replacement made */ FILE *fp = fopen (FNAME, "r+"); /* open file reading/writing */ if (!fp) { /* validate file open for reading/writing */ perror ("fopen-FNAME"); return 1; } while (fgets (buf, MAXSIZE, fp)) { /* read each line in file */ if (!replaced) { /* if replacement not yet made */ char *p = strchr (buf, '='); /* search for '=' in line */ if (p) { /* if found */ size_t plen = 0; /* var for length to end */ p++; /* advance past '=' sign */ plen = strlen (p); /* get length to end */ if (plen < strlen (str)) { /* check avail length */ fprintf (stderr, "error: not enough space in line.\n"); return 1; } strcpy (p, str); /* copy str to p */ if (fseek (fp, -plen, SEEK_CUR)) { /* backup plen chars */ perror ("fseek(fp)"); return 1; } fputs (p, fp); /* overwite contents with replacement */ replaced = 1; /* set flag indicating replacement */ } /* (you can break, and remove output */ } /* here if not writing to stdout) */ fputs (buf, stdout); /* output lines to stdout (optional) */ } if (fclose (fp) == EOF) /* always validate close-after-write */ perror ("fclose-FNAME"); return 0; } 

Usando su archivo logic.txt como una entrada de ejemplo, y nombrando el ejecutable filelogic como lo ha hecho, el uso y operación del código anterior produce:

archivo logic.txt antes

 $ cat logic.txt one=1234 two=3456 

Ejemplo de uso / salida

 $ ./filelogic one=1567 two=3456 

archivo logic.txt despues

 $ cat logic.txt one=1567 two=3456 

Nuevamente, esto está bien para un esfuerzo de aprendizaje, pero en la práctica, evite realizar cambios en los archivos en el lugar, ya que el riesgo de corrupción involuntaria del archivo es mucho mayor que escribir un nuevo archivo con los cambios.