[gelöst] ifstream erreicht nicht eof



  • Hi,

    Ich habe ein Problem mit der ifstream Klasse der STL. Ich habe einen Algorithmus, der den Stream Blockweise nach bestimmten Daten absucht. Jeder Block beginnt mit einer ID und der Blocklänge. Ich überprüfe die ID, ist sie nicht die von mir gesuchte springe ich mit seekg um Blocklänge Bytes weiter und überprüfe den nächsten Block.

    Das ganze funktioniert im Prinzip auch soweit ganz gut. Allerdings bleibt der Suchalgorithmus in einer Endlosschleife hängen, wenn der gesuchte Block nicht im Stream vorhanden ist - obwohl ich in der Suchschleife auf stream.eof() prüfe.

    Meine erste Vermutung war, dass ggf die Blocklänge eines der hinteren Blöcke nicht stimmt und ich irgendwann an einem "Block" ankomme, der eine Länge von 0 hat - und mein Algortihmus damit nichtmehr von der Stelle kommt.
    Ich also mit dem Debugger durch besagte Stellen gesteppt und verblüfft festgestellt, dass sobald der Algorithmus in die Endlosschleife kommt der stream nurnoch 0xFFFF liefert. Auch seekg wird wärend der Endlosschleife ständig mit 0xFFFFFFFF, std::ios_base::cur gefüttert.

    Nun habe ich in der STL Referenz gelesen, dass seekg das fail-Bit setzt, sollte die angesteuerte Stelle nicht erreichbar sein. Ich habe also meinen Stream nach dem ansteuern des nächsten Blocks auf das fail-Bit geprüft, aber es ist, auch wärend der Endlosschleife, nie gesetzt. Ich habe zusätzliche alle anderen stream-Bits geprüft - alle sind nicht gesetzt. Wie auch das eof() nie gesetzt wird, obwohl die Schleife in jedem Druchlauf mit seekg mehr als 200 Millionen Byte nach vorne suchen sollte... ich verstehe nicht, warum keines der Bits gesetzt wird und die Schleife immer weiter läuft.

    Jemand eine Idee oder einen Tip? Code Ausschnitte liefere ich gerne nach, falls diese weiterhelfen könnten.

    Grüße,
    Daniel

    PS: ich habe seekg mit einem unsigned int auf 0xFFFFFFFF gefüttert - was das seekg, was an der Stelle einen signed int natürlich als -1 interpretiert hat. Ein Hoch auf die 2er-Komplement-Darstellung 😕


Anmelden zum Antworten