Frage

In VS 2005, ich habe einige Code, der wie folgt aussieht:

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

Der Code hat gut funktioniert in VS 2005, aber es funktioniert nicht in VS 2008 Express. Von dem, was ich sagen kann, VS 2008 kehrt nicht eof (), nachdem der Code am Ende der Datei sucht. Bin ich etwas fehlt? Ich reparierte sie durch Zugabe eine explizite Überprüfung, ob die Such Lage, um die Dateigröße überschritten, aber ich will sicher sein ich das richtig verstanden ifstream.

War es hilfreich?

Lösung

Der EOF-Flag wird nur dann ausgelöst, nachdem Sie über das Ende der Datei zu lesen versuchen.
upto das Ende der Datei liest, wird es nicht auslösen.

Dies ist, warum die meisten Code sieht wie folgt aus:

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

Wenn das Ergebnis der Lese () geht bis zu dem EOF wird die Schleife eingegeben werden.
Wenn das Ergebnis der Lese () geht vorbei an der EOF wird die Schleife nicht enetered werden

  • Hinweis: read () wird nur über die EOF gehen, wenn es Null-Bytes links in der Datei ist. Sonst wird es bis zum Ende der Datei gelesen. So wird die Schleife immer eingegeben, wenn es somthing in der Datei verlassen wurde.

Der Grund dafür ist das Ergebnis der Lese (der Rückgabewert) ein Hinweis auf den Strom ist. Wenn der Strom in einem booleschen Kontext (wie die, wenn die Testausdruck) verwendet wird, wird es in einen Typ umgewandelt, die in einem solchen Kontext verwendet werden kann. Das Ergebnis dieser Umwandlung testet den EOF-Flag (neben ein paar anderen) und gibt das quivalent von false, wenn EOF ist wahr.

Hinweis:
Diese Technik funktioniert besser, wenn Sie den Operator überlasten << für Ihre Bar-Klasse, da dies genau eingelesen soll, was es für das Objekt muss, ohne über die EOF zu gehen. Es ist dann einfacher, Ihre Objekte zu machen lesen genau bis zum Ende der Datei, ohne über. Das, was ich mit Lese Sorgen über das, was passieren soll, wenn read () will 10 bytesand gibt es nur 5 Bytes in der Datei, was mit dem teilweise gefüllten Objekt passiert?

Wenn Sie mit Ihrem Stil den Code fortgesetzt wird, sollte wie folgt aussehen:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top