Porque evitar el uso de la función feof

Responder
Mensaje
Autor
Avatar de Usuario
rir3760
Mensajes: 7553
Registrado: 01/10/2004 11:00 pm
Ubicación: Mexico

Porque evitar el uso de la función feof

#1 Mensaje por rir3760 » 02/08/2012 9:14 am

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: Seleccionar todo

Primera linea
Segunda linea
Tercera linea
Si ejecutamos el siguiente programa:

Código: Seleccionar todo

#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: Seleccionar todo

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: Seleccionar todo

#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

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado