Pregunta

En VS 2005, tengo un código que se parece a esto:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    loc = ifs.tellg();
    loc += bar.dwHeaderSize;
    // four byte boundary padding
    if ((loc % 4) != 0)
        loc += 4 - (loc % 4);
    ifs.seekg(loc,ios::beg);
}
ifs.close();

El código funcionó bien en VS 2005, pero fracasa en VS 2008 Express. De lo que puedo decir, VS 2008 no está regresando eof () después del código busca el final del archivo. ¿Me estoy perdiendo de algo? Me fijo mediante la adición de una comprobación explícita para ver si la ubicación buscar excede el tamaño del archivo, pero quiero estar seguro de entender ifstream correctamente.

¿Fue útil?

Solución

La bandera EOF se activa sólo después de intentar leer más allá del final del archivo.
Lectura upto al final del archivo no se disparará él.

Esta es la razón por la mayoría código es el siguiente:

while(ifs.read(&bar,sizeof(bar)))
{
     // Do Stuff
}

Si el resultado de la lectura () va hasta el EOF se entra en el bucle.
Si el resultado de la lectura () va más allá de la EF no será enetered el bucle

  • NOTA: leer () sólo irá más allá de la EOF si hay cero bytes que quedan en el archivo. De lo contrario, va a leer hasta el final del archivo. Por lo que siempre se entra en el bucle si había somthing que quedan en el archivo.

La razón es el resultado de la lectura (el valor de retorno) es una referencia a la corriente. Si la corriente se utiliza en un contexto booleano (como la expresión de prueba si) se convierte en un tipo que puede ser utilizado en tal contexto. El resultado de esta conversión a prueba la bandera EOF (además de un par de otros) y devuelve el quivalent de falso si EOF es cierto.

Nota:
Esta técnica funciona mejor si sobrecarga el operador << para su clase bar ya que esto debería leer exactamente lo que necesita para el objeto sin ir más allá de la EOF. Es entonces más fácil de hacer que los objetos leídos exactamente hasta el final del archivo sin pasarse. Lo que me preocupa con la lectura es lo que debería ocurrir si se lee () quiere 10 bytesand sólo hay 5 bytes en el archivo, lo que sucede con el objeto parcialmente lleno?

Si desea seguir utilizando su estilo el código debería tener este aspecto:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top