/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Porque evitar el uso de la función feof

 
      Índice del Foro elrincondelc.com -> FAQ de C
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
rir3760



Registrado: 01 Oct 2004
Mensajes: 7517
Ubicación: Mexico

MensajePublicado: 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
Volver arriba
      Índice del Foro elrincondelc.com -> FAQ de C
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com