Ejercicio 01 — Pide 5 frases al usuario, guardalas en frases.txt y muestralas…
Dificultad: verde · Módulo 09 (Lectura y escritura de archivos)
Enunciado
Pide 5 frases al usuario, guardalas en frases.txt y muestralas numeradas.
Diagrama de flujo

Cómo se resuelve
Este ejercicio hace el ciclo completo de un archivo: primero escribe y luego lee el mismo fichero. El patrón siempre es el mismo: abrir con fopen, comprobar, operar y cerrar con fclose.
FILE *fw = fopen(ARCHIVO, "w")abrefrases.txten modo"w"(write). Ese modo crea el archivo si no existe y lo vacía si ya existía, así que empiezas con la hoja en blanco.fopendevuelve un punteroFILE *, que es tu “mango” para operar sobre el fichero.if (fw == NULL)es el paso que nunca debes saltarte. Si el disco está lleno o no tienes permisos,fopendevuelveNULL; si sigues usando ese puntero el programa revienta. Aquí, si falla, se avisa y se hacereturn 1.- Dentro del bucle,
fgets(frase, sizeof(frase), stdin)lee una línea completa del teclado (a diferencia descanf("%s"), sí admite espacios). Luegofprintf(fw, "%s", frase)la vuelca al archivo: es comoprintf, pero el primer argumento es elFILE *en vez de la pantalla. Comofgetsconserva el\n, cada frase queda en su propia línea. fclose(fw)es obligatorio antes de releer: cierra el archivo y vuelca a disco lo que estaba en el buffer. Sin estefclose, al abrirlo para leer podrías encontrarlo vacío.- Después se reabre en modo
"r"(read) y conwhile (fgets(...) != NULL)se recorre línea a línea hasta el final (EOF, cuandofgetsdevuelveNULL).frase[strcspn(frase, "\n")] = '\0'borra el salto de línea para imprimir limpio y numerado.
Trampa típica: no comprobar el NULL de fopen y, sobre todo, olvidar el fclose del archivo de escritura antes de abrirlo para leer. Los datos se quedan en el buffer y parece que “no se ha guardado nada”.
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 01 — PRACTICA (rellena los TODO)
Enunciado: Pide 5 frases al usuario, guardalas en frases.txt y muestralas numeradas.
Dificultad: verde
Compilar: gcc -std=c11 -Wall ej01_practica.c -o ej01 && ./ej01
*/
#include <stdio.h>
#include <string.h>
#define NUM_FRASES 5
#define MAX_LEN 128
#define ARCHIVO "frases.txt"
int main(void) {
// TODO 1: Declara un puntero FILE * para escritura y abrelo con fopen en modo "w"
// Comprueba que no es NULL; si lo es, imprime un error y haz return 1
char frase[MAX_LEN];
printf("Escribe %d frases (Enter tras cada una):\n", NUM_FRASES);
// TODO 2: Limpia el buffer de stdin antes de usar fgets
// (un bucle getchar hasta '\n' o EOF sirve)
for (int i = 0; i < NUM_FRASES; i++) {
printf("Frase %d: ", i + 1);
// TODO 3: Lee la frase con fgets (guarda en 'frase', maximo MAX_LEN, desde stdin)
// TODO 4: Escribe la frase en el archivo con fprintf (frase ya tiene el '\n')
}
// TODO 5: Cierra el archivo de escritura con fclose
// TODO 6: Abre el mismo archivo en modo "r" para lectura
// Comprueba NULL de nuevo
printf("\n--- Contenido de %s ---\n", ARCHIVO);
int num = 1;
// TODO 7: Bucle con fgets hasta EOF
// Dentro del bucle:
// a) Elimina el '\n' del final: frase[strcspn(frase, "\n")] = '\0';
// b) Imprime con numero de linea
// TODO 8: Cierra el archivo de lectura
return 0;
}Solución — cópiala y ejecútala
/*
Curso de C — Modulo 09: Lectura y escritura de archivos
Ejercicio 01 — MODELO (resuelto)
Enunciado: Pide 5 frases al usuario, guardalas en frases.txt y muestralas numeradas.
Dificultad: verde
Compilar: gcc -std=c11 -Wall ej01_modelo.c -o ej01 && ./ej01
*/
#include <stdio.h>
#include <string.h>
#define NUM_FRASES 5
#define MAX_LEN 128
#define ARCHIVO "frases.txt"
int main(void) {
// --- ESCRITURA ---
FILE *fw = fopen(ARCHIVO, "w");
if (fw == NULL) {
printf("Error: no se pudo crear %s\n", ARCHIVO);
return 1;
}
char frase[MAX_LEN];
printf("Escribe %d frases (Enter tras cada una):\n", NUM_FRASES);
// Limpiar el buffer de entrada antes de usar fgets
int c;
while ((c = getchar()) != '\n' && c != EOF); // vaciar stdin si hay residuos
for (int i = 0; i < NUM_FRASES; i++) {
printf("Frase %d: ", i + 1);
fgets(frase, sizeof(frase), stdin);
// fgets incluye '\n'; lo escribimos tal cual (ya tiene el salto)
fprintf(fw, "%s", frase);
}
fclose(fw); // obligatorio antes de releer
// --- LECTURA Y MUESTRA NUMERADA ---
FILE *fr = fopen(ARCHIVO, "r");
if (fr == NULL) {
printf("Error: no se pudo abrir %s para lectura\n", ARCHIVO);
return 1;
}
printf("\n--- Contenido de %s ---\n", ARCHIVO);
int num = 1;
while (fgets(frase, sizeof(frase), fr) != NULL) {
// Quitar el '\n' final para mostrar limpio
frase[strcspn(frase, "\n")] = '\0';
printf("%d. %s\n", num++, frase);
}
fclose(fr);
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.