Ejercicio 02 — Lee frases.txt y cuenta cuantas lineas tiene

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

Enunciado

Lee frases.txt y cuenta cuantas lineas tiene. Imprime el total.

Diagrama de flujo

Diagrama de flujo del ejercicio 02

Cómo se resuelve

Aquí solo lees, no escribes. La idea es abrir frases.txt, recorrerlo línea a línea y llevar la cuenta.

  1. FILE *fp = fopen(ARCHIVO, "r") abre en modo "r" (read). Este modo no crea el archivo: si no existe, fopen devuelve NULL. Por eso la comprobación if (fp == NULL) no es opcional; además el mensaje sugiere ejecutar antes ej01, que es quien crea el fichero.
  2. El truco del recuento está en el bucle while (fgets(linea, sizeof(linea), fp) != NULL) { contador++; }. fgets lee una línea por llamada y devuelve NULL al llegar al final del archivo, así que cada vuelta del bucle equivale exactamente a una línea leída. No necesitas ni mirar el contenido, solo contar las vueltas.
  3. fclose(fp) cierra el archivo cuando terminas.

Trampa típica: dar por hecho que el archivo existe y no comprobar el NULL. Si frases.txt no está, sin esa comprobación el programa peta al usar fp. La otra es olvidar fclose; al ser solo lectura no pierdes datos, pero es buena costumbre cerrar siempre lo que abres.

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 02 — PRACTICA (rellena los TODO)
  Enunciado: Lee frases.txt y cuenta cuantas lineas tiene. Imprime el total.
  Dificultad: verde
  Compilar: gcc -std=c11 -Wall ej02_practica.c -o ej02 && ./ej02
*/
 
#include <stdio.h>
 
#define ARCHIVO "frases.txt"
#define MAX_LEN 256
 
int main(void) {
    // TODO 1: Abre ARCHIVO en modo lectura ("r") y guarda en FILE *fp
    //         Si fp == NULL, imprime error y haz return 1
 
    int contador = 0;
    char linea[MAX_LEN];
 
    // TODO 2: Bucle con fgets para leer linea a linea hasta EOF
    //         Por cada linea leida, incrementa 'contador'
 
    // TODO 3: Cierra el archivo
 
    // TODO 4: Imprime el resultado:
    //         "El archivo 'frases.txt' tiene X linea(s)."
 
    return 0;
}

Solución — cópiala y ejecútala

/*
  Curso de C — Modulo 09: Lectura y escritura de archivos
  Ejercicio 02 — MODELO (resuelto)
  Enunciado: Lee frases.txt y cuenta cuantas lineas tiene. Imprime el total.
  Dificultad: verde
  Compilar: gcc -std=c11 -Wall ej02_modelo.c -o ej02 && ./ej02
*/
 
#include <stdio.h>
 
#define ARCHIVO "frases.txt"
#define MAX_LEN 256
 
int main(void) {
    FILE *fp = fopen(ARCHIVO, "r");
    if (fp == NULL) {
        printf("Error: no se pudo abrir %s\n", ARCHIVO);
        printf("Crea el archivo primero ejecutando ej01.\n");
        return 1;
    }
 
    int contador = 0;
    char linea[MAX_LEN];
 
    // Cada vez que fgets lee algo, es una linea
    while (fgets(linea, sizeof(linea), fp) != NULL) {
        contador++;
    }
 
    fclose(fp);
    printf("El archivo '%s' tiene %d linea(s).\n", ARCHIVO, contador);
    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