Console Platformübergreifend clearen?



  • Servus und schon wieder eine Frage.
    Die Frage ist recht simpel und doch stellt mich die Lösung nicht zufrieden.
    Und zwahr wie kann man die Console komplet löschen nicht nur unter windows

    system ("cls");
    

    und unter Linux

    system("clear") 
    

    zu nuzen?

    Das würde zwahr gehen da man sich sowas hier basteln kann

    #include <cstdlib>
    
    void cls(){
    if defined(_WIN32) //Prüfen ob Windows
        system("cls");
    
    else
        system("clear");    
      
    Aber gibt es da nicht einen Befehl der die Cmd auf allen Systemen cleard?
    Hab da was zu ANSI-escapesequenzen und zu  dem Befehl clear gelesen. Aber beides wahr sehr dürftig und hat bei mir nicht funktioniert.
    Danke schon mal für die Antworten

  • Mod

    Zuallererst muss klargestellt werden, dass C++ von sich aus keine Vorstellung von einer Konsole hat. Es kann also keinen universellen (d.h. standard-gegebenen) Weg geben, eine Konsole zu leeren. Und ueberhaupt wird jede Anwendung, die mit der Konsole arbeitet, i.d.R. sowieso plattformabhaengig geschrieben werden, ich verstehe also nicht, in welchem Rahmen dieses Problem auftreten kann?

    Wenn Du tatsaechlich einfach ein plattformuebergreifendes Konsolenspiel o.ae. schreiben willst, bieten sich dafuer konzipierte Bibliotheken an. Das kannst Du dann erstmal eigenhaendig recherchieren.



  • Man kann mit ANSI-Escape-Sequenzen tatächlich eine Menge praktischer Sachen in einem Terminalfenster machen, z.B. auch den Bildschirm löschen. Siehe z.B. unter Wikipedia unter Some ANSI control sequences (not an exhaustive list):

    CSI n J Erase in Display: Clears part of the screen. If n is 0 (or missing), clear from cursor to end of screen. If n is 1, clear from cursor to beginning of the screen. If n is 2, clear entire screen (and moves cursor to upper left on DOS ANSI.SYS). If n is 3, clear entire screen and delete all lines saved in the scrollback buffer (this feature was added for xterm and is supported by other terminal applications).

    In C++ könnte das dann einfach so aussehen:

    #include <iostream>
    
    auto main() -> int
    {
        std::cout << "\e[2J";
    }
    

    Allerdings funktionieren diese Sequenzen nur in einem ANSI-kompatiblen Terminal. Unter Linux dürfte das wohl meistens der Fall sein, unter Windows jedoch nicht (es sei denn du führst das Programm in einem entsprechenden Terminal wie z.B. MinTTY aus).

    Wenn du Textmodus-GUI plattformübergreifend machen willst, dann lohnt es sich eventuell eine Bibliothek wie z.B. ncurses zu verwenden. Diese bietet ein einheitliche API für solche (und andere) Funktionen auf verschiedenen Systemen und unter verschiedenen Terminals. Da ich aber selbst noch nicht mit ncurses gearbeitet habe, kann ich dir allerdings nicht mehr dazu sagen. Es gibt allerdings ein deutsches Wikibook, das wahrscheinlich den Einstieg erleichtert.

    Du solltest allerdings auch überlegen, ob eine Textmodus-GUI für dein Programm überhaupt Sinn macht und nicht eher störend ist. Oft ist nämlich ein simples

    • Lesen von cin
    • Daten verabreiten
    • Schreiben nach cout

    völlig ohne UI eine wesentlich praktischere Wahl. So ein Programm kann man nämlich viel einfacher in irgendwelche Skripte einbauen oder mit Shell-Befehlen in eine Pipe einbinden:

    > lese_daten | verarbeite_daten | komprimiere_daten | sende_an_server

    So am Rande: Das simple cin/verarbeiten/cout wäre auch für viele Dozenten ein guter Tip. So waren damals z.B. auch unsere Übungsaufgaben an der Uni strukturiert. Sowas hier ist nicht nur einfacher zu programmieren, sondern auch für die Dozenten leichter zu prüfen und die Visualisierung am Ende ziemlich motivierend für die Studenten:

    > cat daten.txt | uebungsaufgabe | verifiziere_loesung | visualisiere_loesung

    😉


Anmelden zum Antworten