fstream zur laufzeit



  • Die paar Zeilen funktionieren.
    Mein Problem ist, dass ich den Text mit im Code habe.
    Ich will ihn aber quasi mit einem "cin" oder ähnliches zur Laufzeit, also per Nutzereingabe ein die .txt schreiben.


  • Mod

    Die Antwort bleibt immer noch die gleiche. Die (o)streams verhalten sich allgemein alle gleich. Es ist völlig gleich, ob du nach cout oder in eine Datei schreibst. Ersteres bekommst du hin, oder? Dann geht letzteres genauso. Wenn du konkrete Probleme hast, musst du konkreten Code zeigen und konkrete fragen dazu stellen.



  • Wieso fragst du, wie du Text in eine Datei schreibst, wenn dein Problem ist, wie du Nutzereingaben einliest?



  • @Lou-Cyphr3 sagte in fstream zur laufzeit:

    Ich will ihn aber quasi mit einem "cin" oder ähnliches zur Laufzeit, also per Nutzereingabe ein die .txt schreiben.

    Zur Info: auch in deinem Programm wird der Text zur Laufzeit in die Datei geschrieben! Wann denn sonst? Zur Compilezeit wohl kaum! Daher war dein erstes Posting unverständlich.

    std::string s;
    if (getline(std::cin, s)) file << s;
    else { 
       // Fehler: keine Zeile gelesen
     }
    

    (kannst auch mit cin einlesen, wenn du willst)

    Aber wo ist jetzt das Problem?



  • @wob
    Sogesehen schon. Ich meinte aber, dass ich den "Text" schon mit in den Code schreibe, also nach der Logik, dann ja doch irgendwie vorm compilieren also nicht zur Laufzeit. oder nicht?
    Aber ja, der erste Post war dahingehend unverständlich.

    okay ich werd dein Vorschlag mal benutzen.
    Danke



  • Okay,
    ich habe jetzt mal den Code für Ein und Ausgabe geschrieben.
    Würdet ihr noch was beanstanden?

    #include<iostream>
    #include<fstream>
    #include<string>
    
    int main()
    {
    // Eingabe
      std::ofstream file;
      std::string s;
      file.open("PFAD/speichern.txt",std::ofstream::app);
    
      if(getline(std::cin, s)){ file << s << std::endl;
         file.close();
                }
      else{
        std::cerr << "Keine Zeile gefunden" << std::endl;
     }
    
    // Ausgabe
      std::ifstream file_1;
      std::string line;
      file_1.open("PFAD/speichern.txt");
      if(file_1.is_open()){
                while(std::getline(file_1, line)){
                    std::cout << line << std::endl;
                }
                file_1.close();
    }
      else{
      std::cerr << "Fehler beim öffnen" << std::endl;
      }
    
    return 0;
    }
    

    Danke für das Feedback



    • Variablen dort deklarieren wo sie gebraucht werden
    • Konstruktoren verwenden
    • Early exit bei fehlern spart if-else-Kaskaden
    • Keine Konstanten im Code verteilen sondern Namen dafür verwenden
    • Dein Einrückungsstil ist katastrophsky
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
        char const* const filename{ "hugo.txt" };
    
        std::cout << "Please enter a line of text to append to \"" << filename << "\": ";
        std::string line;
        if (!getline(std::cin, line)) {
            std::cerr << "Input error :(\n\n";
            return EXIT_FAILURE;
        }
    
        {
            std::ofstream os{ filename, std::ios::app };
            if (!os.is_open()) {
                std::cerr << "Couldn't open \"" << filename << "\" for writing :(\n\n";
                return EXIT_FAILURE;
            }
            os << line << '\n';
        }
    
        {
            std::ifstream is{ filename };
            if (!is.is_open()) {
                std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n";
                return EXIT_FAILURE;
            }
        	
            while (std::getline(is, line))
                std::cout << line << '\n';
        }
    }
    
    


  • @Swordfish sagte in fstream zur laufzeit:

            while (std::getline(is, line))
                std::cout << line << '\n';
    

    oder die beliebten Einzeiler

    std::cout << is.rdbuf() << '\n';
    

    oder

    std::copy(std::istreambuf_iterator<char>{ is }, std::istreambuf_iterator<char>{}, std::ostream_iterator<char>{ std::cout });
    


  • @Swordfish
    merci



  • @Lou-Cyphr3 ist dir denn klar warum in meinem code nirgends ein .close() steht?



  • @Swordfish
    wahrscheinlich hast du's nicht vergessen. 😉
    Ich weiß es nicht um ehrlich zu sein.
    Vllt weil die Datei geschlossen wird, wenn der Stream endet oder du ja auch kein .open verwendet hast?



  • @Lou-Cyphr3
    Wenn das fstream-Objekt seinen scope verlässt wird es automatisch zerstört und gibt dabei im Destruktor die von ihm verwendeten Resourcen (hier: vermutlich ein FileHandle) wieder frei.


Anmelden zum Antworten