Ejercicio 04 — Copia el contenido de origen.txt a copia.txt línea a línea

Dificultad: amarillo · Módulo 09 (Archivos)

Enunciado

Copia el contenido de origen.txt a copia.txt línea a línea. Imprime cuántas líneas copiaste.

Diagramas de flujo

Diagrama de flujo (actividad) del ejercicio 04

Diagrama de flujo (grafo) del ejercicio 04

Cómo se resuelve

Copiar un archivo es tener dos ficheros abiertos a la vez: uno para leer y otro para escribir. Ahí está toda la gracia del ejercicio.

  1. FILE *fin = fopen(ORIGEN, "r") abre el origen en lectura; si no existe, NULL y se sale.
  2. FILE *fout = fopen(DESTINO, "w") abre el destino en escritura ("w" lo crea o lo vacía). Aquí hay un detalle importante: si esta segunda apertura falla, fin ya está abierto, así que antes de return 1 se hace fclose(fin). Salir sin cerrar lo que ya habías abierto es una fuga de recursos.
  3. El bucle while (fgets(linea, sizeof(linea), fin) != NULL) lee del origen línea a línea, y fprintf(fout, "%s", linea) la escribe tal cual en el destino. Como fgets conserva el \n, la copia mantiene los saltos de línea originales. Se cuenta cada línea con copiadas++.
  4. Al final, fclose(fin) y fclose(fout): cerrar los dos. El de escritura es especialmente importante, porque su fclose es lo que garantiza que todo el buffer llegue realmente a copia.txt.

Trampa típica: comprobar solo un fopen y no el otro, o cerrar solo uno de los dos archivos. Y ojo con confundir "w" con "a": "w" borra el destino antes de copiar, que es justo lo que quieres aquí.

Para practicar — cópialo y complétalo

Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.

/*
  Curso de C — Modulo 09: Lectura y escritura de archivos
  Ejercicio 04 — PRACTICA (rellena los TODO)
  Enunciado: Copia el contenido de origen.txt a copia.txt línea a línea. Imprime cuántas líneas copiaste.
  Dificultad: amarillo
  Compilar: gcc -std=c11 -Wall ej04_practica.c -o ej04 && ./ej04
 
  Nota: crea origen.txt con cualquier contenido antes de ejecutar.
*/
 
#include <stdio.h>
 
#define ORIGEN  "origen.txt"
#define DESTINO "copia.txt"
#define MAX_LEN 512
 
int main(void) {
    // TODO 1: Abre ORIGEN en modo "r" (FILE *fin)
    //         Comprueba NULL; si falla, muestra error y return 1
 
    // TODO 2: Abre DESTINO en modo "w" (FILE *fout)
    //         Comprueba NULL; si falla, cierra fin primero y haz return 1
    //         (importante: cerrar el archivo ya abierto antes de salir)
 
    char linea[MAX_LEN];
    int copiadas = 0;
 
    // TODO 3: Bucle con fgets desde fin hasta EOF
    //         Por cada linea: escribe en fout con fprintf y suma copiadas
 
    // TODO 4: Cierra ambos archivos (fin y fout)
 
    // TODO 5: Imprime: "Copiadas X linea(s) de 'origen.txt' a 'copia.txt'."
 
    return 0;
}

Solución — cópiala y ejecútala

/*
  Curso de C — Modulo 09: Lectura y escritura de archivos
  Ejercicio 04 — MODELO (resuelto)
  Enunciado: Copia el contenido de origen.txt a copia.txt línea a línea. Imprime cuántas líneas copiaste.
  Dificultad: amarillo
  Compilar: gcc -std=c11 -Wall ej04_modelo.c -o ej04 && ./ej04
 
  Nota: crea origen.txt con cualquier contenido antes de ejecutar.
*/
 
#include <stdio.h>
#include <string.h>
 
#define ORIGEN "origen.txt"
#define DESTINO "copia.txt"
#define MAX_LEN 512
 
int main(void) {
    FILE *fin = fopen(ORIGEN, "r");
    if (fin == NULL) {
        printf("Error: no se pudo abrir '%s'\n", ORIGEN);
        printf("Crea el archivo con algun contenido primero.\n");
        return 1;
    }
 
    FILE *fout = fopen(DESTINO, "w");
    if (fout == NULL) {
        printf("Error: no se pudo crear '%s'\n", DESTINO);
        fclose(fin); // cerrar el que ya estaba abierto
        return 1;
    }
 
    char linea[MAX_LEN];
    int copiadas = 0;
 
    while (fgets(linea, sizeof(linea), fin) != NULL) {
        fprintf(fout, "%s", linea); // linea ya incluye '\n'
        copiadas++;
    }
 
    fclose(fin);
    fclose(fout);
 
    printf("Copiadas %d linea(s) de '%s' a '%s'.\n", copiadas, ORIGEN, DESTINO);
    return 0;
}

Ejecútalo en el navegador

▶ Abrir y ejecutar en Compiler Explorer

Se abre con la solución ya cargada; pulsa el botón de ejecutar (Run) para ver la salida. No hay que instalar nada.

Cómo usarlo

Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.

Conexiones