Ejercicio 04 — Copia el contenido de origen.txt a copia.txt linea a linea

Dificultad: amarillo · Módulo 09 (Lectura y escritura de archivos)

Enunciado

Copia el contenido de origen.txt a copia.txt linea a linea. Imprime cuantas lineas copiaste.

Diagrama de flujo

Diagrama de flujo 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 en Dev-C++

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 linea a linea. Imprime cuantas lineas 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 linea a linea. Imprime cuantas lineas 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;
}

Cómo usarlo

Dev-C++ (Windows): Archivo → Nuevo → Código fuente, pega el código y pulsa F11 (compilar y ejecutar). Si ves los acentos raros en la consola, escribe chcp 65001 y vuelve a ejecutar.

Conexiones