Domanda

In VS 2005, ho qualche codice che assomiglia a questo:

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();

Il codice ha funzionato bene in VS 2005, ma non riesce in VS 2008 Express. Da quello che posso dire, VS 2008 non restituisce EOF () dopo il codice cerca alla fine del file. Mi sto perdendo qualcosa? Ho risolto con l'aggiunta di un controllo esplicito per vedere se la posizione cercare superato la dimensione del file, ma voglio essere sicuro di aver capito ifstream correttamente.

È stato utile?

Soluzione

Il flag EOF viene attivato solo dopo che si tenta di leggere oltre la fine del file.
Leggendo upto alla fine del file non si innescherà esso.

Questo è il motivo per cui la maggior parte del codice è simile al seguente:

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

Se il risultato della read () va fino al EOF sarà inserito il ciclo.
Se il risultato della read () passa l'EOF NON verrà enetered il ciclo

  • NOTA: read () andrà solo oltre l'EOF se ci sono zero byte lasciati nel file. In caso contrario, si leggerà fino alla fine del file. Così il ciclo viene sempre inserito se c'era somthing rimasto nel file.

Il motivo è il risultato della lettura (il valore di ritorno) è un riferimento al flusso. Se il flusso è utilizzato in un contesto booleano (come l'espressione if test) viene convertito in un tipo che può essere utilizzato in questo contesto. Il risultato di questa conversione mette alla prova il flag EOF (oltre a un paio di altri) e restituisce l'equivalente il di false se EOF è vero.

Nota:
Questa tecnica funziona meglio se si esegue l'overload dell'operatore << per la classe Bar in quanto questo dovrebbe leggere esattamente ciò di cui ha bisogno per l'oggetto senza andare oltre l'EOF. E 'quindi più facile fare i vostri oggetti lette esattamente fino alla fine del file senza andare oltre. La cosa che mi preoccupa di lettura è quello che dovrebbe accadere se read () vuole 10 bytesand ci sono solo 5 byte del file, cosa succede con l'oggetto parzialmente riempito?

Se si desidera continuare a utilizzare il vostro stile il codice dovrebbe essere simile a questo:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top