¿Cómo usar feof (ARCHIVO * f)?

4 minutos de lectura

¿Como usar feof ARCHIVO f
k-hombre

Estoy teniendo dificultades con un bucle do-while, que se supone que se detiene cuando llegamos al final del archivo. Aquí está el código del bucle:

do  {
    if (pcompanyRow[0] != '#' && pass == 1) {
        strtok(pcompanyRow, ":");
        pcompanyName = strcpy(pcompanyName, strtok(NULL, ""));
        pass = 2;
        fgets(pcompanyRow, 1024, f);
    }
    if (pcompanyRow[0] != '#' && pass == 2) {
        strtok(pcompanyRow, ":");
        pcompanySMSPrice = strcpy(pcompanySMSPrice, strtok(NULL , ""));
        pass = 3;
        fgets(pcompanyRow, 1024 , f);
    }
    if (pcompanyRow[0] != '#' && pass == 3) {
        strtok(pcompanyRow, ":");
        pcompanyMMSPrice = strcpy(pcompanyMMSPrice, strtok(NULL, ""));
        pass = 4;
        fgets(pcompanyRow, 1024, f);
    }
    if (pass == 4)  {
        AppendCompanyNode(pcompanyList, pcompanyName, pcompanySMSPrice, pcompanyMMSPrice);
        pass = 1;
    }
} while (!feof(f));

Después de ejecutar el depurador, me di cuenta de que todos los problemas de fallas que tengo se deben a que no sale de este ciclo, incluso cuando llega a todas las líneas.

¿Cómo debo escribirlo correctamente?

  • Como dicen las respuestas, la respuesta sucinta es “No usas feof ()”. La única vez que usa ‘feof ()’ es cuando obtiene una indicación de error o eof de una función de entrada principal (fgets() por ejemplo) y decide que quiere distinguir entre EOF y un error. La mayoría de las veces, la mayoría de las personas no se molestan en distinguir entre los dos (yo específicamente, pero la mayoría del código que he visto). no recuerdo haber usado feof() en absoluto, lo que significa que probablemente lo he usado un par de veces en el último cuarto de siglo de programación en C.

    –Jonathan Leffler

    28 de noviembre de 2010 a las 22:17

  • @Jonathan: Creo que tiene mucho más sentido verificar ferror(f) en vez de !feof(f) si desea saber si se produjo un error. A veces feof es útil en bucles do-while, pero estoy de acuerdo en que es bastante inútil la mayor parte del tiempo.

    – R.. GitHub DEJA DE AYUDAR A ICE

    28 de noviembre de 2010 a las 22:35

  • @R..: sí, tiene más sentido usar ferror() que feof(), pero confieso que tampoco lo uso a menudo. Pero debería haberlo dicho en mi comentario, o haber agregado un segundo ya que me estaba quedando sin espacio.

    –Jonathan Leffler

    28 de noviembre de 2010 a las 22:37

Nunca debe usar feof() como indicador de salida de un bucle. feof() es VERDADERO solo después de leer el final del archivo (EOF), no cuando se alcanza el EOF

Fuente aquí. También explica el problema en detalle y cómo solucionarlo.

  • cambié el while a eso: while(fgets(pcompanyRow, 1024 , f) != NULL)

    – k-hombre

    28 de noviembre de 2010 a las 23:04


  • de todas formas no se detiene!! Puedo ver el valor de pcompanyRow, tomó nuevamente la primera línea, me trae las líneas del archivo en bucle y no se detiene… ¿qué puedo hacer?

    – k-hombre

    28 de noviembre de 2010 a las 23:06

  • +1, pero cuestiono la redacción. EOF nunca se ‘lee’. Una función de lectura puede devolver EOF como resultado de encontrar el final del archivo, pero EOF no es un valor que se lea.

    – William Pursell

    26 de marzo de 2011 a las 13:05

  • El código que había señalado muestra que se está realizando una lectura adicional debido a feof(). Ejecuté exactamente el mismo código, no tengo ese problema. ¿Alguna idea de por qué?

    – Somjit

    13 de diciembre de 2014 a las 17:24


Cambiaría tu ciclo y lógica para usar esto:

while (fgets(pcompanyRow, 1024, f) != NULL) {

    /* do things */

}

cuando fgets() intente leer más allá del final del archivo, devolverá NULL y saldrá del ciclo. Todavía puedes seguir usando pass y sus otras banderas/lógica, pero las condiciones que verifique serán ligeramente diferentes.

  • Una vez que se completa el ciclo, puede usar feof(f) para determinar si fue EOF o un error

    – EvilTeach

    28 de noviembre de 2010 a las 22:19

  • eso es lo que hice… ¡y aún así no se detiene! sigue trayéndome líneas

    – k-hombre

    28 de noviembre de 2010 a las 23:08

Sugiero usar tanto fgets() como feof(). La última cadena en el archivo puede tener \n o no. Si usa solo feof (), puede omitir (perder) la última línea.

 for(;;)
 {char *pc;

  pc=fgets(buf,sizeof(buf),fd);

  if(!pc)
    {//it may be read error or end of file
      if(feof(fd))
        {//it is end of file, normal exit from for
         break;      
        }
       else
        {//it is i/o error 
         fclose(fd);
         return 2;
        }
    }
}//for

¿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