good()-Funktion erklären



  • Hi,

    ich suche schon seit 2 Stunden nach einer Erklärung der Good()-Funktion, und habe noch kein zufriedenstellendes Ergebnis... Vielleicht liegt es auch daran, dass ich die Erklärungen aus dem Netz nicht auf mein Problem übertragen kann... wer weiss..

    Ich habe vor Ewigkeiten mal C++ an der Uni gelernt (Basics) und möchte es jetzt wieder anwenden...

    Ich möchte eine Textdatei öffnen und den Inhalt auslesen.

    Ich habe folgendes Problem:

    am Ende der Datei angelangt, möchte ich die Datei schließen mit quelle.close();

    Dann prüfe ich mit der good()-Fnktion, ob es auch geklappt hat (Zeile 45). Aber es klappt nicht! und ich frage mich, warum eigentlich nicht...

    Schonmal Danke für die Hilfe...

    Hier der Code:

    #include <cstdlib>
    #include <iostream>
    #include <fstream.h> 
    #include <string>
    
    using namespace std;
    
    int main()
    {
        char *dateiname;
        int endOfFile;
        char string[256];
    
        dateiname = "C:\\Users\\D2AANTD\\Desktop\\7E0.199.343b_drehmomentstuetze.txt";
    
        ifstream quelle;
    
        quelle.open(dateiname, ios::in);
    
        if (quelle.good() == 0)
        {
                cout << "Oeffnen der Datei " << dateiname << " nicht gelungen" << endl;             
        }
        else
        {
            quelle.seekg(0L, ios::beg); 
            //setzt den Dateizeiger an den Anfang der Datei. Im allgemeinen bestimmt das erste Argument der Methode seekg den relativen Abstand vom zweiten. 
            //Hier bedeutet das erste Aurgumt: keinen Abstand von ios::beg. („0L“ steht für „0 Long Integer“). Und ios::beg meint genau den Dateianfang. 
            //Andere Werte für ios in diesem Zusammenhang: 
            //ios::end Dateiende
            //ios::cur aktuelle Position("current")
            //So würde also -1L, ios::end den Dateizeiger eien Byte vor Dateiende stellen., 5L, ios::curr den Pointer um 5 Byte von der aktuellen Position Richtung Dateiende schieben. 
            //Hier also wird sicherheitshalber der Dateizeiger auf den Anfang gesetzt
            do
            {
               endOfFile = quelle.eof();
               if (endOfFile !=1)
               {
                       quelle.getline(string, 255);
                       cout << string << endl;         
               }                
            } while (endOfFile != 1);   
        }
    
    quelle.close();
    if (quelle.good() == 0)
    {
    cout <<"schließen der Datei nicht erfolgreich!"<< endl;
    } 
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • good() gibt Dir nur dann true zurück, wenn Du weiter aus dem Stream lesen kannst. Da Du den Stream schon geschlossen hast, geht das natürlich nicht mehr und good() gibt false zurück.



  • also kann ich mir diese Prüfung am Ende auch schenken, oder???

    so wie ich das verstehe ergibt mein code an dieser stelle gar keinen sinn...



  • Das Standardvorgehen wäre folgendes:

    #include <cstdlib>
    #include <iostream>
    #include <fstream.h>
    #include <string>
    
    using namespace std;
    
    int main()
    {   
        const char *dateiname = "C:\\Users\\D2AANTD\\Desktop\\7E0.199.343b_drehmomentstuetze.txt"; // kein Grund für std::string
    
        ifstream quelle(dateiname); // Konstruktor benutzen. ios::in ist implizit für ifstream
        if (!quelle) {
                cout << "Oeffnen der Datei " << dateiname << " nicht gelungen" << endl;
                return 1; // Grundsätzliches Prinzip: Je weniger Einrückung desto besser
                          // so sparen wir uns das else{
        }
        // seek völlig unnötig. Kommentare über die Benutzung gehören nicht in den Code
    
        string line; // Variablen möglichst lokal.
        while (getline(quelle, line)) {
            cout << string << endl
        }
    
        //quelle.close(); <-- braucht es nicht, macht der Destruktor automatisch.
        // Ist auch immer erfolgreich.
    
        // Hmpf. Ok.
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Ja, diese ganze eof Geschichte ist bei den C++ Streams IMHO etwas unglücklich gelöst. Am einfachsten geht´s wohl so:

    string line;
    while( getline( quelle, line ) )
    {
       ...
    }
    


  • ok, soweit so gut... vielen dank dafür...

    und nur zum verständnis: ich muss den destructorbefehl hier nicht explizit angeben, weil dass c++ schon alleine macht, richtig???



  • Ja! Das nennt man RAII und ist eines der wichtigesten Programmiertechniken von C++. Wenn du es nicht kennst, lerne es besser früher als später: http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization



  • alles klar... vielen Dank!


Anmelden zum Antworten