Status der Dateioperation abfragen



  • Hallo!

    Ich habe jetzt nochmal eine Frage wie man richtig (sauberes C++) den Status einer erfolgten Dateioperation abfragt?

    Ist dieses hier korrekt oder gibt es eine bessere Möglichkeit:

    if (!file.write(pBuf, 10))
    {
        std::cout << "Fehler beim Schreiben.";
    }
    


  • Der Rückgabewert von write ist eine Referenz auf ostream ist. Ich weiß nicht, ob ein kaputter ostream "false" ist.
    Ansonsten siehe:
    tellp
    bad
    fail
    good



  • schorsch code schrieb:

    Ich weiß nicht, ob ein kaputter ostream "false" ist.

    Ja, ist er - die Stream-Klassen bieten eine Typumwandlung nach void* (liefert NULL=false, wenn fail() gesetzt ist) und einen operator! (liefert true, wenn fail() gesetzt ist).



  • es gibt für die fstreams auch noch die methode is_open.
    Wenn Du versuchst einen bereits geöffneten fstream erneut zu öffnen,
    wird das fail() dir melden, dass ein Fehler aufgetreten ist, obwohl Du eigentlich noch mit dem Stream arbeiten kannst.

    Beispiel:

    ofstream Datei("Test.txt"); // Öffnet und initialisiert den Stream
    Datei.open("AndereDatei.txt"); // Versucht erneut zu öffnen, failbit wird gesetzt
    
    if(Datei.fail())
    {
       // Hier wird der Fehler erkannt
    }
    
    Datei << "Hallo Welt"; // Wird in die "Test.txt" geschrieben, obwohl das failstate gesetzt war.
    

    Besser wäre gewesen :

    ofstream Datei("Test.txt"); // Öffnet und initialisiert den Stream
    
    if(Datei.is_open())
    {
        Datei.close(); // Schliesst den Stream
    }
    Datei.open("AndereDatei.txt"); // Versucht erneut zu öffnen, failbit wird nicht gesetzt
    

    Gruß Paddy



  • paddy@work schrieb:

    es gibt für die fstreams auch noch die methode is_open.
    Wenn Du versuchst einen bereits geöffneten fstream erneut zu öffnen,
    wird das fail() dir melden, dass ein Fehler aufgetreten ist, obwohl Du eigentlich noch mit dem Stream arbeiten kannst.

    Erstens: Afaik schließt open() die bisher geöffnete Datei, wenn vorhanden.
    Zweitens: Solange irgendeins der Fehlerflags gesetzt ist, wird der Stream sämtliche Schreib- und Leseanfragen ignorieren - das mußt du schon selber mit clear() zurücksetzen, bevor du weitermachen kannst.



  • Ich würde einfach die Exceptions einschalten, und schon bräuchte ich nichts mehr groß abfragen. Die Statusflags sind doch noch Steinzeit-Konstrukte und noch aus reinen Kompatibilitätsgründen zu altem Sourcecode vorhanden.



  • @CStoll:

    Du hast recht, dass man das Failbit zurücksetzen muss, aber open schliesst die bereits geöffnete Datei nicht.

    Das Failbit sagt aus, dass die letzte Operation fehlgeschlagen ist. Man kann den Fehler aber behandeln/ beheben. Wenn allerdings das Badbit gesetzt ist, ist die Integrität des Streams verloren. Man kann davon ausgehen, dass der Fehler nicht mehr behebbar ist.

    Kleine Übersicht:

    • good() --> Wahr, wenn kein errorflag gesetzt ist
    • eof() --> Wahr, wenn eofbit gesetzt ist
    • fail() --> Wahr, wenn failbit oder badbit gesetzt ist
    • bad() --> Wahr, wenn badbit gesetzt ist
    • operator !() --> Siehe fail()
    • operator void* () --> NULL pointer wenn fail(), ansonsten ein "nicht NULL" Wert
    #include <fstream>
    #include <iostream>
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	std::ofstream Datei("C:/Test.txt");
    	Datei.open("C:/Test2.txt");
    	if(Datei.fail())
    	{
    		std::cout << "Failed, but ..." << std::endl;
    		if(Datei.is_open())
    		{
    			std::cout << "C:/Test.txt is still open and connected to stream" << std::endl;
    			Datei.clear();
    		}
    
    	}
    	Datei << "Hallo Welt\n";
    	Datei.close();
    	return 0;
    }
    

    Probier mal kurz dieses Programm aus....



  • @Artchi:

    Die Exceptions sind aber doch auch nur eine Kapsel um die flags, vermute ich mal...
    Du musst/ kannst doch beim Einschalten der Exceptions auch die errorflags angeben, bei denen eine Exception geworfen werden soll....

    stream.exceptions(ios_base::badbit | ios::failbit || ios::eofbit);


Log in to reply