ofstream / Eingabe bleibt hängen



  • Warum kann ich bei folgendem Code nur einmal was eintippen, wenn ich einen Satz eintippe, und dann ENTER drücke, dann kommt zwar wieder eine Eingabe (blickender Strich), aber ich kann nicht mehr schreiben. Des hängt sich also auf. Aber warum?

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string temp;
        ofstream FILE;
    
        FILE.open("D:/Hans.txt", ios::out | ios::app);
        if(!FILE)
        cout << "ERROR\n";
        else
        {
            {
                getline(cin,temp);
                if(temp!="exit")
                FILE << temp << "\n";
            }while(temp!="exit");
            FILE.close();
        }
    
        return 0;
    }
    

    MfG
    Stromberg



  • Du hast anscheinend an "do" am Anfang deiner Schleife vergessen.

    Ohne dies erstellst du nur einen neuen Scope, liest eine Zeile ein, und startest dann eine Schleife die nichts tut ausser darauf zu warten, dass temp != exit wird.



  • #include <iostream>
    #include <fstream>
    #include <string>
    
    int main()
    {
        std::ofstream file_stream("D:\\Hans.txt", std::ios::app);
        if (!file_stream) { std::cerr << "Datei \"hans.txt\" konnte nicht geöffnet werden!" << std::endl; return 1; }
    
        std::string tmp;
        while (std::getline(std::cin, tmp) && tmp != "exit") file_stream << tmp << std::endl;
    }
    

    soo ist es korrekt 😛



  • Hab ich schon ezählt, das ich noch nie den Unterschied von "cerr" und "cout" verstanden habe. Also "cerr" verwendet man immer wenn es draum geht um Fehler auszugegeben, okay, aber das sagt mir nichts. Warum, wieso, weshalb....kann mir jemand idiotensicher den Unterschied erklären? Vll. an nem Beispiel Code?
    Und wenn wir dann schon dabei sind, könnte man dann auch noch "clog" mit einbeziehen, hab ich nämlich auch nie verstanden!? 😃
    MfG
    Stromberg



  • cin, cout, cerr und clog sind eigentlich vier verschiedene Streams, wobei aber die letzten drei standardmäßig auf die Konsole umgeleitet werden.

    In der DOS-Box bzw. unter Unix/Linux in der Konsole kann man aber die Streams beim Aufruf eines Programms umleiten:

    cin:  <file
    cout: >file    // Datei neu anlegen
          >>file   // Text an bestehende Datei anhängen
    cerr: 2>file
          2>>file
    

    Und clog dient als Stream für Logging-Meldungen. Diesen kann man wohl bisher nur direkt im C++ Programm umleiten.

    So kannst du also z.B. die Eingabe aus einer Datei lesen und den Text und die Fehlermeldungen in zwei verschiedene Dateien schreiben:

    prog <input >text 2>errors
    


  • Diese Referenz hilft dir sicherlich etwas weiter: http://cplusplus.com/reference/iostream/cout.html



  • Th schrieb:

    Und clog dient als Stream für Logging-Meldungen. Diesen kann man wohl bisher nur direkt im C++ Programm umleiten.

    Nicht ganz - er hängt am selben Ausgabekanal wie cerr und wird auch mit diesem zusammen umgebogen (der Unterschied ist die Pufferung - cerr-Ausgaben werden ungepuffert weitergeleitet, clog-Ausgaben gepuffert).



  • CStoll schrieb:

    Nicht ganz - er hängt am selben Ausgabekanal wie cerr und wird auch mit diesem zusammen umgebogen (der Unterschied ist die Pufferung - cerr-Ausgaben werden ungepuffert weitergeleitet, clog-Ausgaben gepuffert).

    Kann man so pauschal auch nicht sagen. Ich kenne mindestens eine Maschine die für Out, Error, Log und List getrennte Ausgabekanäle hat 😉


Anmelden zum Antworten