rir3760

Registrado: 01 Oct 2004 Mensajes: 7516 Ubicación: Mexico
| Publicado: 02/08/2012 9:14 am | | | Título: Porque evitar el uso de la función feof |
| El problema principal con esa función es lógico: ella no revisa el contenido del archivo indicando si faltan datos que leer. En su lugar retorna:
A) Verdadero (distinto de cero) si la ultima operación de lectura fallo porque se alcanzo el final del archivo. B) Falso (cero) si la ultima operación de lectura fue exitosa.
Otro problema al utilizar esa función es terminar con un programa ligeramente mas largo. Supongamos que el archivo de texto "entrada.txt" consiste de solo tres lineas las cuales son:
| Código: | Primera linea Segunda linea Tercera linea |
Si ejecutamos el siguiente programa:
| Código: | #include <stdio.h> #include <stdlib.h>
#define NOM_ENTRADA "entrada.txt" #define NUM_CHARS (80 + 1)
int main(void) { FILE *entrada; char linea[NUM_CHARS]; int num_lineas; if ((entrada = fopen(NOM_ENTRADA, "rt")) == NULL){ perror(NOM_ENTRADA); return EXIT_FAILURE; } num_lineas = 0; while (!feof(entrada)){ fgets(linea, NUM_CHARS, entrada); num_lineas++; } fclose(entrada); printf("Numero de lineas: %d\n", num_lineas); return EXIT_SUCCESS; } |
Su salida (por supuesto incorrecta) es:
| Código: | Numero de lineas: 4 |
La forma recomendada y que produce el resultado correcto es evitando el uso de "feof", esto es posible en la gran mayoría de las ocasiones ya que las funciones de lectura como (en este caso particular) "fgets" retornan un valor útil indicando el resultado de la operación.
Otra ventaja al realizar los cambios es reducir ligeramente el programa:
| Código: | #include <stdio.h> #include <stdlib.h>
#define NOM_ENTRADA "entrada.txt" #define NUM_CHARS (80 + 1)
int main(void) { FILE *entrada; char linea[NUM_CHARS]; int num_lineas; if ((entrada = fopen(NOM_ENTRADA, "rt")) == NULL){ perror(NOM_ENTRADA); return EXIT_FAILURE; } num_lineas = 0; while (fgets(linea, NUM_CHARS, entrada) != NULL) num_lineas++; fclose(entrada); printf("Numero de lineas: %d\n", num_lineas); return EXIT_SUCCESS; } |
_________________ C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly. -- Kernighan & Ritchie, The C programming language |
|