¿Funciona feof () cuando se llama después de leer en la última línea?

Acabo de leer en una cadena usando la siguiente statement:

fgets(string, 100, file); 

Esta cadena que acabo de leer era la última línea. Si llamo a feof() ¿volverá VERDADERO? ¿Es lo mismo que llamar a feof() justo al principio antes de leer cualquier línea?

La respuesta corta es NO . Aquí es por qué:

Si fgets leyó con éxito '\n' al final de la línea, no se ha establecido el indicador de fin de archivo en la estructura de FILE . Por feof() tanto, feof() devolverá 0 , justo como debería antes de leer cualquier cosa, incluso en un archivo vacío.

feof() solo se puede usar para distinguir entre condiciones de fin de archivo y error de lectura después de que fallara una operación de entrada. De manera similar, ferr() se puede usar para verificar el error de lectura después de que falló una operación de entrada.

Los progtwigdores generalmente ignoran la diferencia entre el final del archivo y el error de lectura. Por lo tanto, solo dependen de verificar si la operación de entrada tuvo éxito o falló. Por lo tanto, nunca usan feof() , y tú también deberías.

El comportamiento es algo similar al de errno : errno está establecido por algunas funciones de la biblioteca en caso de error o falla. No se restablece a 0 en caso de éxito. La comprobación de errno después de una llamada de función solo tiene sentido si la operación falló y si errno se borró a 0 antes de la llamada de función.

Si desea comprobar si realmente llegó al archivo, debe intentar leer información adicional. Por ejemplo puedes usar esta función:

 int is_at_end_of_file(FILE *f) { int c = getc(file); if (c == EOF) { return 1; } else { ungetc(c, file); return 0; } } 

Pero la lectura de una entrada adicional puede no valer la pena si se lee desde la consola: requerirá que el usuario escriba una entrada adicional que se mantendrá en la secuencia de entrada. Si se lee desde una tubería o un dispositivo, el efecto secundario puede ser aún más problemático. Lamentablemente, no hay una forma portátil de probar si una secuencia de FILE está asociada con un archivo real.

¿Funciona feof () cuando se llama después de leer en la última línea?

No.

feof() convierte en verdadero cuando se lee más allá del final de los datos. La lectura de la última línea no se puede pasar al final de los datos si la última línea terminó en '\n' .

No, no use feof() para detectar el final del archivo. En su lugar, compruebe si hay un error de lectura, por ejemplo, fgets() devolverá NULL si intenta leer más allá del final del archivo, mientras que feof() devolverá 0 hasta que alguna función intente leer más allá del final del archivo, solo después de eso devuelve un valor distinto de cero.