Ejercicio 03 — Lee numeros.txt (enteros, uno por linea) y muestra su suma y media
Dificultad: amarillo · Módulo 09 (Lectura y escritura de archivos)
Enunciado
Lee numeros.txt (enteros, uno por linea) y muestra su suma y media.
Diagrama de flujo

Cómo se resuelve
Este ejercicio lee números, no líneas de texto, así que la herramienta cambia de fgets a fscanf.
- Se abre
numeros.txten modo"r"y se compruebaNULLcomo siempre. - El corazón es
while (fscanf(fp, "%d", &n) == 1).fscanfintenta leer un entero y devuelve cuántos valores ha leído con éxito:1si consiguió un número, y algo distinto (EOF) al llegar al final. Comparar== 1es la forma correcta de saber “sí, he leído un número válido, sigo”. Fíjate en el&n: al ser una variable escalar,fscanfnecesita su dirección para poder rellenarla. - Dentro del bucle se acumula
suma += ny se cuentacount++. Después se cierra el archivo. - Antes de dividir se comprueba
if (count == 0): si el archivo estaba vacío, dividir entre cero sería un error. - La media se calcula con
(double)suma / count. Ese cast adoublees clave: si dividieras dos enteros, C haría división entera y perderías los decimales (12 / 5daría2en lugar de2.40).
Trampa típica: además del fopen sin comprobar, aquí lo fácil es olvidar el & en fscanf (comportamiento indefinido) y caer en la división entera al calcular la media.
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 03 — PRACTICA (rellena los TODO)
Enunciado: Lee numeros.txt (enteros, uno por linea) y muestra su suma y media.
Dificultad: amarillo
Compilar: gcc -std=c11 -Wall ej03_practica.c -o ej03 && ./ej03
Nota: crea numeros.txt con enteros, uno por linea. Ejemplo:
3
7
2
10
*/
#include <stdio.h>
#define ARCHIVO "numeros.txt"
int main(void) {
// TODO 1: Abre ARCHIVO en modo "r"; comprueba NULL
int n;
long suma = 0;
int count = 0;
// TODO 2: Bucle con fscanf(fp, "%d", &n) mientras devuelva 1
// Dentro: acumula suma y cuenta los numeros
// TODO 3: Cierra el archivo
// TODO 4: Si count == 0, avisa de archivo vacio y haz return 1
// TODO 5: Calcula la media como double (cuidado con la division entera)
// Imprime: numeros leidos, suma, media con 2 decimales
return 0;
}Solución — cópiala y ejecútala
/*
Curso de C — Modulo 09: Lectura y escritura de archivos
Ejercicio 03 — MODELO (resuelto)
Enunciado: Lee numeros.txt (enteros, uno por linea) y muestra su suma y media.
Dificultad: amarillo
Compilar: gcc -std=c11 -Wall ej03_modelo.c -o ej03 && ./ej03
Nota: crea numeros.txt con contenido como:
3
7
2
10
*/
#include <stdio.h>
#define ARCHIVO "numeros.txt"
int main(void) {
FILE *fp = fopen(ARCHIVO, "r");
if (fp == NULL) {
printf("Error: no se pudo abrir %s\n", ARCHIVO);
printf("Crea el archivo con enteros (uno por linea).\n");
return 1;
}
int n;
long suma = 0;
int count = 0;
// fscanf devuelve el numero de items leidos; 1 = exito, EOF = fin o error
while (fscanf(fp, "%d", &n) == 1) {
suma += n;
count++;
}
fclose(fp);
if (count == 0) {
printf("El archivo esta vacio o no contiene enteros validos.\n");
return 1;
}
double media = (double)suma / count;
printf("Numeros leidos: %d\n", count);
printf("Suma: %ld\n", suma);
printf("Media: %.2f\n", media);
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.