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

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.
FILE *fin = fopen(ORIGEN, "r")abre el origen en lectura; si no existe,NULLy se sale.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,finya está abierto, así que antes dereturn 1se hacefclose(fin). Salir sin cerrar lo que ya habías abierto es una fuga de recursos.- El bucle
while (fgets(linea, sizeof(linea), fin) != NULL)lee del origen línea a línea, yfprintf(fout, "%s", linea)la escribe tal cual en el destino. Comofgetsconserva el\n, la copia mantiene los saltos de línea originales. Se cuenta cada línea concopiadas++. - Al final,
fclose(fin)yfclose(fout): cerrar los dos. El de escritura es especialmente importante, porque sufclosees lo que garantiza que todo el buffer llegue realmente acopia.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.