Ifstream Seekg crasht



  • Ich möchte eine Binärdatei einlesen (Windows Visual C). Nachdem ich die Datei öffne, benutze ich seekg um den Dateizeiger an das Dateiende zu bewegen um danach die Größe fest zu stellen.
    Wenn ich seekg benutze, crasht das Programm aber. Der Crash ist in der Datei _file.c in der Funktion void __cdecl _lock_file am Ende bei EnterCriticalSection statt. Das die Datei geöffnet wird, habe ich mit ifstream.is_open() schon geprüft. Kann den Fehler nicht finden. Weiß hier vieleicht jemand Rat?

    std::ifstream fin(filename, std::ios::binary);	
    
    	/*if(fin.is_open())
    	{
    		MessageBox(0, L"Open", 0, 0);
    	}*/
    
    	fin.seekg(0, std::ios_base::end);
    	int size = (int)fin.tellg();
    	fin.seekg(0, std::ios_base::beg);	
    
    	fin.read(&compiledShader[0], size);
    	fin.close();
    

  • Mod

    Anhaltspunkte:
    1. Ist compiledShader auch groß genug? Es ist verdächtig, dass du zuerst die Größe misst und dann nur für read benutzt. Da kannst du dir die Größenmessung doch auch gleich sparen und einfach bis zur maximalen Größe lesen (read funktioniert schließlich auch mit weniger Daten als man angibt, siehe gcount)
    2. Das Verhalten von seekg auf mit binary geöffneten Dateien ist streng genommen undefiniert. Ist zwar ein bisschen verwunderlich, dass eine Implementierung da abstürzen sollte, aber ist zumindest möglich. Kannst du ja mal spaßeshalber ohne binary ausprobieren.
    3. Möglicher Datenverlust durch deine Typumwandlungen? Sollte auch nicht abstürzen, aber ist zumindest falsch. Den Compiler mit einem Cast* zu beruhigen ist normalerweise keine gute Idee, Compiler haben mit ihren Warnungen und Fehlern in der Regel recht.

    *: Zudem noch ein C-Style Cast. Ich wette du weißt nicht einmal genau, was der überhaupt macht oder gar machen könnte.



  • SeppJ schrieb:

    Anhaltspunkte:
    1. Ist compiledShader auch groß genug? Es ist verdächtig, dass du zuerst die Größe misst und dann nur für read benutzt. Da kannst du dir die Größenmessung doch auch gleich sparen und einfach bis zur maximalen Größe lesen (read funktioniert schließlich auch mit weniger Daten als man angibt, siehe gcount)

    Ja da fehlt auch eine Zeile dazwischen, weil ich in zwei teilen reinkopiert habe, hier nochmal der ganze code davon:

    std::ifstream fin(filename, std::ios::binary);	
    
    	/*if(fin.is_open())
    	{
    		MessageBox(0, L"Open", 0, 0);
    	}*/
    
    	fin.seekg(0, std::ios_base::end);
    	int size = (int)fin.tellg();
    	fin.seekg(0, std::ios_base::beg);
    	std::vector<char> compiledShader(size);
    
    	fin.read(&compiledShader[0], size);
    	fin.close();
    

    Aber eigentlich ist ja nur die Stelle bis seekg interessant, da es bei seekg abstürzt. Die Größe brauche ich ja für den Vector.

    SeppJ schrieb:

    2. Kannst du ja mal spaßeshalber ohne binary ausprobieren.

    Ja werde ich mal machen.

    SeppJ schrieb:

    3.[...]Compiler haben mit ihren Warnungen und Fehlern in der Regel recht.

    Ich habe keinen einzige Warnung beim Kompilieren.



  • wtf schrieb:

    SeppJ schrieb:

    3.[...]Compiler haben mit ihren Warnungen und Fehlern in der Regel recht.

    Ich habe keinen einzige Warnung beim Kompilieren.

    Warum dann der Cast?



  • [quote="manni66"]

    wtf schrieb:

    Warum dann der Cast?

    Die Aussage bezog sich natürlich darauf wie der Code ist, also mit Cast. Aber das war ja nicht das Problem.

    Ohne Binary war der Fehler übrigends genau so da.

    Habe jetzt mal den Rechner neu gestartet, da ich vermutete, dass vielleicht irgendwelche Zombieprozesse verhindern, dass die Datei gelockt werden kann....

    Jetzt nach dem Neustart crasht seekg nicht mehr. Dafür bekomme ich aber bei tellg -1 zurück....



  • ups bitte löschen



  • Ok nun funktioniert es. Ich bekam jetzt bei tellg jetzt -1 zurück, weil die Datei nicht mehr im Projektordner des Visual Studio Projektes vorhanden war.

    Das erste Problem mit seekg lag wohl daran, dass die Datei nicht gelockt werden konnte, da noch irgendein Zombie Prozess darauf zugriff.


Anmelden zum Antworten