Problema con EOF al determinar el final de la transmisión

2 minutos de lectura

avatar de usuario
Verano_Más_Más_Té

Cuando trato de determinar el final del archivo con la función feof(FILE *), encuentro que no funciona como esperaba: se requiere una lectura adicional incluso si la transmisión finaliza. P.ej, feof(FILE*) no devolverá verdadero si se invoca en un archivo con datos de 10 bytes justo después de leer 10 bytes. Necesito una operación de lectura adicional que, por supuesto, devuelve 0. Entonces feof(FILE *) dirá “OK, ahora llegas al final”.

por que es uno mas read requerido y cómo puedo determinar el final del archivo o cómo puedo saber cuántos bytes quedan en una secuencia de archivos si no quiero que feof-¿estilo?

  • c-faq.com/stdio/feof.html

    – Estera

    17 de mayo de 2011 a las 11:07

  • posible duplicado de In C, ¿”while (! Feof (…))” siempre está mal?

    – Bo Person

    17 de mayo de 2011 a las 11:58

  • Piense en un arroyo como agua detrás de un grifo. cuando quieres algo (un carácter: getchar()una línea: fgets()un montón de datos: fread()…) abres el grifo, obtienes lo que quieres y cierras el grifo. Si funcionó no se puede saber si hay más agua; o si el grifo se va a romper a continuación. Si falla, puede determinar por qué falló: porque no había suficiente agua (feof es verdad); o porque se rompió el grifo (ferror es verdad).

    – pmg

    17 de mayo de 2011 a las 12:03


No use feof() ni ninguna variante, es tan simple como eso. Desea que prediga de alguna manera que la próxima lectura fallará, pero eso no es lo que hace: le dice cuál es el resultado de la anterior leer fue. La forma correcta de leer un archivo es (en pseudocódigo):

while(read(file, buffer)) {
   // Do something with buffer
}

En otras palabras, debe probar el resultado de la operación de lectura. Esto es cierto tanto para los flujos de C como para los iostreams de C++.

  • Y si realmente necesita mirar hacia adelante, con iostreams puede usar peek.

    –Björn Pollex

    17 mayo 2011 a las 11:15

  • feof es útil, pero no para lo que OP quiere. El uso es probar para ver si una falla de lectura se debió a EOF o error de lectura.

    – R.. GitHub DEJA DE AYUDAR A ICE

    17 mayo 2011 a las 12:43

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad