fstream mehrfach verwenden



  • Hi Leute,
    ich hatte neulich n kleines Problem mit dem Dateien öffnen und wollt deshalb mal was nachfragen: Kann ich einen fstream mehrfach verwenden?

    fstream f;
    f.open("test1.txt", ios::in);
    f.getline(..., ...);
    f.close();
    
    f.open("test2.txt", ios::in);
    f.getline(..., ...);
    f.close();
    

    funktioniert das so?
    Wollt neulich so was auslesen und das anzeigen, kam aber nix.

    MfG Daniel



  • killmichnich schrieb:

    Kann ich einen fstream mehrfach verwenden?

    fstream f;
    f.open("test1.txt", ios::in);
    f.getline(..., ...);
    f.close();
    
    f.open("test2.txt", ios::in);
    f.getline(..., ...);
    f.close();
    

    funktioniert das so?

    Hallo Daniel,

    das kann funktionieren, muss aber nicht. Das liegt an den internen Zuständen, die (f)stream annehmen kann. Mit einem open sind diese Zustände (z.B. Fehler oder EOF oder bestimmte Formatierungen) nicht weg. Besser man erzeugt jedesmal ein neues Objekt (nein, es ist nicht wirklich langsamer, gemessen an der Gesamtlaufzeit) .. dafür kann man das close weglassen - also:

    {
        ifstream f("test1.txt");
        f.getline(..., ...);
    }
    {
        ifstream f("test2.txt");
        f.getline(..., ...);
    }
    

    übrigens - Ich steh' auf dem Standpunkt: getline ist doof, aber das ist eine andere Geschichte.

    :xmas2: Werner



  • ok danke dann mach ich einfach viele fstreams :xmas1:

    ach und was würdest du statt getline nehmen?



  • f ist sowieso schon mal ein beschissener Name für eine Variable. Nimm besser sprechende Namen, dann hast du keine Probleme weil dann die Variablen irgendwie "settingsFileStream" und "dataFileStream" oder so heißen. Falls die Dateien den gleichen Inhalt haben, dann mach ne Funktion.


  • Administrator

    killmichnich schrieb:

    ach und was würdest du statt getline nehmen?

    Wohl die globale std::getline Funktion für std::string :
    http://www.cplusplus.com/reference/string/getline.html

    Die std::istream::getline Funktion, empfindet ich persönlich auch als doof 🙂

    Grüssli



  • und was is da dran dann großartig besser/anders? 😕


  • Administrator

    killmichnich schrieb:

    und was is da dran dann großartig besser/anders? 😕

    1. Keine C-Arrays, sondern ein std::string .
    2. Grundsätzlich ist es egal, aus wievielen Zeichen die Zeile besteht. Sie wird immer vollständig eingelesen.

    char line1[256];
    file.getline(line1, 256);
    // Was passiert, wenn die Zeile mehr als 256 Zeichen hat?
    // Zudem, was soll das blöde Char-Array.
    
    std::string line2;
    std::getline(file, line2);
    // Punkt aus. Um die Speicherverwaltung wird auch gesorgt.
    // Wir haben ein Objekt, sind in C++, kein C mitgeschleppt.
    // Keine Gedanken um die terminierende 0 usw. usf. Deutlich weniger Fehlerquellen.
    

    Grüssli



  • ok danke :xmas1:



  • Werner Salomon schrieb:

    das kann funktionieren, muss aber nicht. Das liegt an den internen Zuständen, die (f)stream annehmen kann. Mit einem open sind diese Zustände (z.B. Fehler oder EOF oder bestimmte Formatierungen) nicht weg. Besser man erzeugt jedesmal ein neues Objekt (nein, es ist nicht wirklich langsamer, gemessen an der Gesamtlaufzeit) ..

    Man kann auch einfach clear() aufrufen, um die Fehlerflags zurückzusetzen.


Anmelden zum Antworten