Problem mit fstream



  • Hallo, ich versuche grade ein kleines Spiel zu programmieren das auch eine Speicherfunktion haben soll. Ich schreibe zum Speichern die wichtigen Daten in eine Datei. Am Beginn des Spiels wird abgefragt, ob man ein neues Spiel anfangen oder einen Speicherstand laden will. Wenn man jetzt aber "Spiel laden" auswählt ohne dass ein Speicherstand vorhanden ist, sollte das Spiel mit Fehlermeldung abbrechen. Aber wie kann ich abfragen, ob eine Datei existiert? Etwa so?

    ifstream auslesen;
    auslesen.open("speicher.txt");
    if( !auslesen ) 
    {
       cerr << "Speicherstand existiert nicht!" << endl;
    }
    


  • hi,

    würde es über try and catch machen:

    try
    	{
    		auslesen.open("speicher.txt");
    	}
    	catch (...)
    	{
    		cout << "Deine Fehlermeldung" << endl;
    	}
    


  • Mit Boost oder API aus deinem OS:
    http://www.boost.org/libs/filesystem/doc/index.htm



  • if ((file_ = ::CreateFileW (file.c_str (), GENERIC_ALL, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE)
    

    Source: http://spieleprogrammierer.de/phpBB2/viewtopic.php?t=6188



  • Avalon schrieb:

    hi,

    würde es über try and catch machen:

    try
    	{
    		auslesen.open("speicher.txt");
    	}
    	catch (...)
    	{
    		cout << "Deine Fehlermeldung" << endl;
    	}
    

    ne, das geht so nicht.

    mfg.



  • Also die API zu benutzen geht mir für mein kleines Textspielchen jetzt eindeutig zu weit. Von dem Link hab ich erhlich gesagt auch nicht viel verstanden. Ich wollte eigentlich nur wissen ob beim Code

    ifstream auslesen;
    auslesen.open("speicher.txt");
    if( !auslesen )
    {
       cerr << "Speicherstand existiert nicht!" << endl;
    }
    

    der Ausdruck "!auslesen" false zurückliefert wenn die Datei nicht existiert oder nicht. Oder wird die Datei dann von Programm erzeugt?



  • @Avalon: Per Default werfen die streams keine Exceptions. D.h., wenn man etwas derartiges machen möchte, muss man vorher (mindestens) ein

    mystream.exceptions(ios::failbit)
    

    reinhauen, damit eine Exception geworfen wird, sofern irgendwann (u.a. auch bei einem Versuch eine nicht existierende Datei zu öffen) das failbit gesetzt wird.

    edit: Siehe auch joomoo.

    @Tetrapak: Deine Intuition ist genau richtig. Hast du es denn nicht bereits ausprobiert? Wenn auf eine Datei mit Hilfe eines std::streams in einem Modus zugegriffen werden soll, der diese bei Nichtexistenz nicht erzeugt, wird intern per Default das failbit gesetzt. Dieses kannst du nun entweder über den überladenen op! (Dieser liefert true, wenn entweder das failbit *oder* das badbit gesetzt ist) oder mit der Methode fail abfragen.

    Bsp:

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream in("non_existent_file");
        if(in.fail()) // oder in(!if)
            // failbit ist gesetzt => Fehler beim öffnen.
        ...
    }
    

    xGhost: Bei den von dem OP gestellten Anforderungen reicht die Standardlib doch aus...

    Gruß, Caipi



  • Wenn auf eine Datei mit Hilfe eines std::streams in einem Modus zugegriffen werden soll, der diese bei Nichtexistenz nicht erzeugt, wird intern per Default das failbit gesetzt.

    Ich nehme an, dass alle Schreiben-Modi in dem Fall die Datei erzeugen würden oder?



  • Tetrapak schrieb:

    Wenn auf eine Datei mit Hilfe eines std::streams in einem Modus zugegriffen werden soll, der diese bei Nichtexistenz nicht erzeugt, wird intern per Default das failbit gesetzt.

    Ich nehme an, dass alle Schreiben-Modi in dem Fall die Datei erzeugen würden oder?

    Warum probierst du es nicht einfach mal aus?



  • Caipi schrieb:

    @Avalon: Per Default werfen die streams keine Exceptions. D.h., wenn man etwas derartiges machen möchte, muss man vorher (mindestens) ein

    mystream.exceptions(ios::failbit)
    

    reinhauen, damit eine Exception geworfen wird, sofern irgendwann (u.a. auch bei einem Versuch eine nicht existierende Datei zu öffen) das failbit gesetzt wird.

    edit: Siehe auch joomoo.

    Gruß, Caipi

    jo stimmt 🙄 war wohl ein wenig zu viel vcl in letzter zeit 😮


Log in to reply