Codificación aprenderaprogramar.com: CU00543F
FIN DE ARCHIVO. EOF Y FEOF EN C
EOF (End Of File)es un parámetro booleano útil para facilitar el cierre de bucles de extracción de datos desde archivo. En C,EOF es una constante de tipo entero (normalmente -1) que es el retorno que envían distintas funciones de extracción de información desde archivos al llegar a un final de archivo y no existir más datos. También se puede “simular” EOF mediante una entrada de teclado, normalmente CTRL+Z y enter ó CTRL+D y enter según el sistema operativo que empleemos.
Prueba este código, cuya ejecución debe concluir al pulsar CTRL-Z y enter ó CTRL-D y enter.
#include <stdio.h> #include <stdlib.h> int main() { int entrada=0; printf("Escribe un caracter: "); while ((scanf("%c%*c", &entrada)) != EOF) { printf("La entrada no ha sido EOF\n", EOF); printf("Escribe un caracter:\n"); } return 0; // Ejemplo aprenderaprogramar.com } |
Pero el interés principal de EOF está en la extracción de datos desde archivos. Recordemos que para acceder a un fichero usábamos FILE* nombreInternoFichero; Si se trata de extraer mayor número de datos del que existen en un archivo aparecerá un error del tipo "La entrada de datos ha sobrepasado el final del archivo". Para evitarlo utilizaremos la función feof con esta sintaxis:
while (!feof(fichero)) |
Consideremos el archivo libros.dat donde teníamos 10 datos numéricos.
La extracción de datos usando feof se haría de la siguiente manera (para ello debemos crear el archivo libros.dat y ubicarlo en el directorio de trabajo):
#include <stdio.h> |
El resultado esperado es que se muestre: Extraido: 55 Extraido: 10 Extraido: -99 Extraido: 35 Extraido: 7 Extraido: -66 Extraido: 88 Extraido: 12 Extraido: -33 Extraido: -500 Alcanzado el final del fichero.
EJERCICIO Nº1: ENUNCIADO
Transformar en código el siguiente pseudocódigo y razonar para comprender su lógica. En un fichero tenemos las notas establecidas entre 0 y 10 de un grupo de alumnos de una clase. Cada nota está en una línea del fichero. Se desean extraer las notas en un array nota(1), nota(2), …, nota(n) y en base al sumatorio de dicho array, determinar la nota media. Dado que no se conoce el número de alumnos a priori, deberá emplearse la señal Fin de archivo (EOF) para la extracción de datos.Considerar que el número de datos es igual o inferior a 50.
Pseudocódigo:
1. Inicio [Media con Finarchivo aprenderaprogramar.com] 2. Mientras Finarchivo = Falso Hacer i = i + 1 Leer Nota(i) Suma = Suma + Nota(i) Repetir 3. Media = Suma / i 4. Mostrar “La nota media de la clase es”, Media 5. Fin |
EJERCICIO Nº1: SOLUCIÓN
Vamos a considerar que el archivo con los datos es notas.dat y que contiene los siguientes 35 valores:
6 – 7 – 8 – 5 – 6 – 4 – 7 – 8 – 7 – 10 – 0 – 5 – 6 – 7 – 6 – 5 – 0 – 7 – 8 – 10 – 2 – 3 – 4 – 5 – 6 – 7 – 6 – 5 – 4 – 10 – 4 – 3 – 2 – 3 – 4
En el fichero habrá un dato en cada línea. Aquí los hemos escrito separados por guiones por motivos de espacio. El código sería el siguiente:
#include <stdio.h> #include <stdlib.h> #define NUMELEMENTOS 50 // Ejercicios resueltos aprenderaprogramar.com int main() { int i=0; double nota[NUMELEMENTOS]; double suma=0.0; double media=0.0; FILE* fichero; fichero = fopen("notas.dat", "rt"); while (!feof(fichero)) { fscanf (fichero, "%lf", ¬a[i]); suma = suma + nota[i]; i = i+1; //Valor final de i será 35 } fclose(fichero); media = suma/i; printf ("La media es %lf", media); return 0; } |
EJERCICIO
En un archivo denominado miTexto.txt existen varias líneas de texto. Crear un programa que extraiga el contenido de las líneas hasta el final del archivo usando eof ó feof y las muestre por pantalla.
Ejemplo: si el contenido del archivo es el siguiente.
Cumpliendo con mi oficio piedra con piedra, pluma a pluma, pasa el invierno y deja sitios abandonados. |
El resultado de ejecución deberá ser el siguiente:
Linea 1 contiene: Cumpliendo con mi oficio Linea 2 contiene: piedra con piedra, pluma a pluma, Linea 3 contiene: pasa el invierno y deja Linea 4 contiene: sitios abandonados. |
Añade varias líneas más al archivo y comprueba que el programa las extrae todas.
Para comprobar si tus respuestas son correctas puedes consultar en los foros aprenderaprogramar.com.
Para hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.