Agregar al final de un archivo en C

3 minutos de lectura

Estoy tratando de agregar el contenido de un archivo myfile.txt al final de un segundo archivo myfile2.txt en c. Puedo copiar el contenido, pero no puedo encontrar una manera de agregar. Aquí está mi código:

FILE *pFile;
FILE *pFile2;
char buffer[256];

pFile=fopen("myfile.txt", "r");
pFile2=fopen("myfile2.txt", r+);
if(pFile==NULL) {
    perror("Error opening file.");
}
else {
    while(!feof(pFile)) {
        if(fgets(buffer, 100, pFile) != NULL) {
        fseek(pFile2, -100, SEEK_END);
        fprintf(pFile2, buffer);
    }
}
fclose(pFile);
fclose(pFile2);

No creo que esté usando fseek correctamente, pero lo que estoy tratando de hacer es llamar a fseek para colocar el puntero al final del archivo, luego escribir en la ubicación de ese puntero, en lugar de al principio del archivo. expediente. ¿Es este el enfoque correcto?

  • (Además de las respuestas a continuación) Su fseek la idea debería funcionar, pero como usas SEEK_END el ‘puntero’ ya está al final– y luego vas “atrás” 100 caracteres. Utilizar 0 para el desplazamiento y debería funcionar. (Menor: verifica si su archivo de lectura puede abrirse, pero no su archivo de escritura. Verifique ambos).

    – Jongware

    17/10/2013 a las 14:27

  • ¿Por qué while (! Feof (archivo)) nunca es correcto

    – usuario3629249

    20 de mayo de 2019 a las 1:50


  • Un error tipográfico en la línea 12, la llave no está cerrada

    – hachís

    6 de julio de 2020 a las 2:15

Abrir con agregar:

pFile2 = fopen("myfile2.txt", "a");

entonces solo escribe a pFile2no hay necesidad de fseek().

  • Sin embargo, debe tener en cuenta que ANSI C requiere fseek() u otra función de posicionamiento.

    – Wyatt Ward

    3 de enero de 2016 a las 17:38

  • @Wyatt8740: ¿dónde? Mi norma dice: “Abrir un archivo con el modo de adición (a como el primer carácter en el argumento del modo) hará que todas las escrituras subsiguientes en el archivo sean forzadas al final del archivo actual, independientemente de las llamadas intermedias a fseek(). Por supuesto que no es ANSI C, es ISO C.

    – oscuro

    3 de enero de 2016 a las 22:56

  • de GNU man fopen: “Tenga en cuenta que ANSI C requiere que una función de posicionamiento de archivos intervenga entre la salida y la entrada, a menos que una operación de entrada encuentre el final del archivo”. Sin embargo, parece que lo leí mal, es solo cuando se alterna entre entrada y salida.

    – Wyatt Ward

    04/01/2016 a las 17:40


  • @ Wyatt8740: eso es justo, y esa es también mi experiencia. Aunque creo que si estuviera leyendo y escribiendo al mismo tiempo, probablemente usaría interfaces de nivel más bajo que stdio.

    – oscuro

    5 de enero de 2016 a las 10:28

  • ¿El uso de “a” se agregará desde una nueva línea o en línea?

    – Chaitanya

    5 oct 2019 a las 20:23

Siguiendo la documentación de fopen:

“a” Abierto para escribir. El archivo se crea si no existe. La secuencia se coloca al final del archivo. Las escrituras subsiguientes en el archivo siempre terminarán en el final actual del archivo, independientemente de cualquier fseek(3) intermedio o similar.

Así que si usted pFile2=fopen("myfile2.txt", "a"); la transmisión se coloca al final para agregarse automáticamente. solo haz:

FILE *pFile;
FILE *pFile2;
char buffer[256];

pFile=fopen("myfile.txt", "r");
pFile2=fopen("myfile2.txt", "a");
if(pFile==NULL) {
    perror("Error opening file.");
}
else {
    while(fgets(buffer, sizeof(buffer), pFile)) {
        fprintf(pFile2, "%s", buffer);
    }
}
fclose(pFile);
fclose(pFile2);

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad