eof () ¿mala práctica? [duplicate]

5 minutos de lectura

eof ¿mala practica duplicate
Sam

Posible duplicado:

¿Por qué iostream::eof dentro de una condición de bucle se considera incorrecta?

Así que he estado usando el eof() funciona en muchos de mis programas que requieren entrada de archivos, y mi profesor dijo que está bien usarlo, pero algunas personas en SO han dicho que no debería usarlo sin especificar realmente el motivo. Así que me preguntaba, ¿hay una buena razón?

  • Supongo que te refieres a la feof() ¿función?

    –Oliver Charlesworth

    29 de abril de 2011 a las 21:36

  • Probablemente se refiere al iostream::eof().

    – Cachorro

    29 de abril de 2011 a las 21:37

Puedes usar eof para probar la condición exacta que informa, ya sea que han intentado leer más allá del final del archivo. No puede usarlo para probar si hay más entradas para leer o si la lectura se realizó correctamente, que son pruebas más comunes.

Incorrecto:

while (!cin.eof()) {
  cin >> foo;
}

Correcto:

if (!(cin >> foo)) {
  if (cin.eof()) {
    cout << "read failed due to EOF\n";
  } else {
    cout << "read failed due to something other than EOF\n";
  }
}

  • pero si ha leído más allá del final del archivo, ¿no debería haber información restante?

    – sam

    29 de abril de 2011 a las 21:43

  • @Sam: eof() no significa que “la posición del archivo esté al final y la próxima lectura fallará”. Significa “Has intentado leer algo más allá de final del archivo y eso falló”

    – Erik

    29 de abril de 2011 a las 21:46


  • Creo que entiendo lo que dices, pero ¿qué daño podría causar leer más allá del final del archivo? ¿No tendrías todos los datos extraídos? ¿O está diciendo que a veces no quiere todos los datos? O..

    – sam

    29 de abril de 2011 a las 21:48

  • @Sam: El punto es que en un while (!eof()) { cin >> foo; } bucle que no estás leyendo Hasta que fin del documento. Estás leyendo hasta el final del archivo. y una vez más. Y no está probando las otras formas en que una lectura puede fallar.

    – Erik

    29 de abril de 2011 a las 21:49


  • @Sam: int foo; while (!cin.eof()) { cin >> foo; cout << foo << "\n" }. Esta es una construcción típica, que no hace lo que el programador pretendía. Va a no leer todos los ints y mostrarlos de nuevo, se a lo mejor lea todos los enteros y muéstrelos, luego muestre el último una vez más. Si le das, por ejemplo, “1 2 abc” como entrada, leerá y mostrará “1”, “2”, luego repetirá para siempre mostrando “2” una y otra vez.

    – Erik

    29 de abril de 2011 a las 21:54

No debería usarlo porque si la entrada falla por otra razón, puede estar jodido.

while(!file.eof()) {
    int i;
    file >> i;
    doSomething(i);
}

¿Qué sucede en el ciclo anterior si el contenido del archivo es “WHAARRRRRRGARBL”? Se repite infinitamente, porque no es el final del archivo, pero aún no puede extraer un int de él.

  • solo como pensar en voz alta, pero ¿no podría simplemente ponerlo en una cadena y luego manipularlo? ¿O es simplemente ineficiente?

    – sam

    29 de abril de 2011 a las 21:44

  • Ineficiente, y cuál es el punto de usar una entrada formateada como cin >> somedouble >> someint >> somechar; ?

    – Drisa

    1 de agosto de 2012 a las 21:47

¿Cómo lo estás utilizando? Qué .eof() le dirá es que la secuencia ya llegó al final del archivo, que ha intentado leer datos que no están allí.

Esto no suele ser lo que quieres. Por lo general, desea saber que está llegando al final del archivo, o que está a punto de llegar al final del archivo, y no que ya lo haya hecho. En un bucle como:

while(!f.eof())
{
    f >> /* something */;
    /* do stuff */
}

va a intentar leer la entrada y fallar, y luego va a ejecutar todo en /* do stuff */y luego la condición del bucle falla y el bucle se detiene.

Otro problema con ese ciclo es que hay otras formas en que la entrada puede fallar. Si hay una condición de error en el archivo que no es EOF, .fail() regresará true pero .eof() no lo haré

  • Entonces, ¿está diciendo que es porque mi variable o lo que sea que esté eligiendo para almacenar los datos no será adecuado para ese tipo? No estoy seguro de por qué esto me parece tan confuso.

    – sam

    29 de abril de 2011 a las 21:52

  • @Sam: Leer los datos incorrectos es una posibilidad, pero tendrá que lidiar con eso por separado. No activará el .eof() función o cualquier otra similar. Sin embargo, si hay un error del sistema al leer el archivo, probablemente también desee detenerlo.

    –David Thornley

    29/04/2011 a las 22:00

En caso de que las respuestas anteriores sean confusas:

Lo que la gente piensa que hace está mal:

  • eof() no busca si la última parte que leyó incluía el último byte del archivo.
  • No mira para ver si el siguiente byte está después del final del archivo.

Lo que realmente hace:

  • eof() informa si la última lectura incluyó bytes más allá del final del archivo.

Si eof() es verdadero, ya cometió un error. Así explica la declaración del profesor. Úselo para lo que significa, se ha producido un error.

¿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