Aus .txt Datei lesen



  • bool write::fill_in(bool remove)
    {
        ofstream file;
        if(remove) file.open(m_file_name.c_str()); //Datei wird immer neu erstellt
        else file.open(m_file_name.c_str(), ios::out | ios::app); //In Datei weiter schreiben
    
        if (!file) return false;
        string buffer;
        while(getline(cin,buffer))
        {
            if(buffer == "exit") return true;
            file << buffer << "\n";
        }
        return file;
    }
    

    nicht so perfekt 😉

    bool write::fill_in(std::istream& in = std::cin, bool empty = true)
    {
        std::ofstream file_stream(m_file_name.c_str(), empty == true ? std::ios::out : std::ios::app);
        if (!file_stream) return false;
    
        std::string buffer;
        while (std::getline(in, buffer) && buffer != "exit")
            file_stream << buffer << "\n";
    
        return file_stream;
    }
    

    ... bei std::ofstream ist standardmäßig std::ios::out drin. kannst es hier in dem Fall für den einfachen Vergleich aber misbrauchen 😉 Und die Schleife kannst du auch verkürzen (s. Code) und statt return true hättest du sonst auch lieber gucken sollen ob file_stream einen Fehler gefunden hat 😉

    //Methode um Datein auszulesen
    bool read::readout(std::ostream& out) const
    {
        if (!out) return false; // sonst wird hier noch das std::ifstream Objekt erzeugt! ...
    
        std::ifstream file_stream(m_file_name.c_str());
        if (!file_stream) return false;
    
        std::string buffer;
        while (std::getline(file_stream, buffer))
            out << buffer << "\n";
    
        return true;
    }
    


  • Heißt das hier:

    ...empty == true ? std::ios::out : std::ios::app);
    

    soviel wie "wenn empty true ist, dann setzte als Parameter "std::ios::out : std::ios::app", wenn nicht dann setz einfach nichts (also halt default Parameter)?
    Das sowas geht, wusste ich anfangs nicht, weil ich hab das erst so gemacht:

    if(remove) ofstream file(.....);
    else ofstream file(.....,.....);
    

    Aber is ja Unsinn, weil des wird ja nur innerhlab des if-Scope deklariert, und verliert außerhalb dann seine Wertigkeit.
    Und des halb hab ich das mit dem ".open"....gemacht..aber is ja alles schlecht, des von dir is natürlich um einiges besser.
    MfG
    Stromberg



  • nein, es bedeutet "wenn empty true ist, dann setze als parameter ios::out, andernfalls ios::app" (':' bedeutet andernfalls)

    abgesehen davon sollte man mit boolschen werten keine vergleiche machen (weil es ohne auch geht)



  • Ja, aber wie kann n das gehen, wenn empty "true" ist, dann wird "ios::out" gesetzt. Verstehe ich noch, aber wenn empty "false" ist, dann wird ja "ios::app" gesetzt, aber das muss doch immer "ios::out | ios::app" heißen, nicht nur "ios::app"?
    Wie nennt man n das eigentlich ":" und "?" Vergleichsoperatoren für Parameter oder was... hab davon igrendwie noch nie was mitbekommen 😞
    Hat jemand einen Link wo da noch bissel ins Detail gegangen wird, oder kann man da nich mehr viel ins Detail gehen?
    Also ich mein mit if kann ich schon umgehen....aber die dinger da hab ich irgendwien icht gekannt.
    MfG
    Stromberg



  • sollte es, ja.

    das "ding" ?: nennt sich der "ternäre operator", der einzige operator mit drei operanden, der außerdem nicht überladen werden kann.



  • Also setzte er dann noch "ios::out" automatisch zu "ios::app" dazu oder wie?
    MfG
    Stromberg



  • Naja du hast schon recht, theoretisch steht da bei empty == false nur ein std::ios_base::app. Doch da du einen std::ofstream gewählt hast, ist automatisch std::ios_base::out gesetzt 😉 Kannst auch empty == true ? 0 : std::ios_base::app nehmen, sollte auch gehen.



  • ja, so geht es auch. es funktioniert nur dann nicht mehr, wenn du den ofstream gegen einen fstream austauschst.


Anmelden zum Antworten