Bildschirm löschen, außer 2 Zeilen



  • Aloa!

    Kurz und knapp: Wie kann ich, während einer laufenden Eingabe mit scanf, den Bildschirm eines Konsolenfensters löschen, außer die letzten 2 Zeilen, ohne den Cursor umzupositionieren?
    printf("\033[2J") löscht ja den gesamten Bildschirm und mit printf("\033[nK") kann man, je nach n, scheinbar Zeilen löschen. Aber das hilft mir nicht weiter.

    Hoffe auf eine Antwort!



  • Mit ANSI-Mitteln kannst du den Bildschirm überhaupt nicht löschen (selbst die Escape-Sequenzen, die du dort rausgekramt hast, sind systemspezifisch). Und wenn du nur Teile des Bildschirm löschen willst, kannst du sie mit Leerzeichen übermalen (unter Windows z.B. per WriteConsoleOutputCharacter()) - oder den kompletten Bildschirm löschen und die letzten zwei Zeilen neu hinschreiben.

    PS: Wenn dir die Cursorposition wichtig ist: zwischenspeichern und am Ende zurücksetzen 😉



  • printf("\033[2J") löscht ja den gesamten Bildschirm

    Das ist zwar eine bekannte Form aber ich finde sie *brrr,bibber* zum verzweifeln unleserlich. Besser ist der system-Aufruf in stdlib.h!



  • böser Code schrieb:

    printf("\033[2J") löscht ja den gesamten Bildschirm

    Das ist zwar eine bekannte Form aber ich finde sie *brrr,bibber* zum verzweifeln unleserlich. Besser ist der system-Aufruf in stdlib.h!

    system() ist böser code, sollte also nicht verwendet werden 😉

    CStoll hat doch schon eine gute lösung geliefert...



  • Jay schrieb:

    böser Code schrieb:

    printf("\033[2J") löscht ja den gesamten Bildschirm

    Das ist zwar eine bekannte Form aber ich finde sie *brrr,bibber* zum verzweifeln unleserlich. Besser ist der system-Aufruf in stdlib.h!

    system() ist böser code, sollte also nicht verwendet werden 😉

    CStoll hat doch schon eine gute lösung geliefert...

    die etwas schwerer ist als für ein billiges programm system("CLS") zu benutzen,
    es ist klar dass es schlecht ist aber solange du deine programme nicht verkaufst würde ich es zumal benutzen, sobald du etwas verkaufst programmierst du eh nicht mehr mit system() weil dein wissen das einfache übersteigt. also niemals nie !



  • Uh, diese Escape-Sequenzen sind ANSI-standardisiert. Sie sind allerdings nicht Teil von C, und unter Windows muss man ein bisschen tricksen, um sie ans Laufen zu kriegen. Prinzipiell gibt es im C-Standard keine Möglichkeit, viel auf der Konsole zu machen, da sich das Programm nicht mal darauf verlassen kann, dass es überhaupt an einem interaktiven Terminal hängt (Das selbe gilt für C++, und hat schon vielen Leuten, die fflush(stdin); oder std::cin.ignore(std::cin.rdbuf()->in_avail()); benutzen wollten den Kopf zerbrochen, als ihr Code auf einmal portabel sein sollte).

    Ohne Umpositionieren wirst du so oder so wohl nicht hinkommen, aber wenn dir die ANSI-Sequenzen zur Verfügung stehen, dann ist das nicht das Problem. Zum Beispiel:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
      int rows = dasmuesstichjetztnochrauskriegen();
    
      for(int i = 0; i < columns; ++i) {
        puts("foooooooooooooooooooooooooooooooooooO");
      }
    
      printf("\x1b[s\x1b[1A"); /* Position speichern, Zeile rauf */
      for(int i = 0; i < rows - 2; ++i) {
        printf("\x1b[1A\x1b[K"); /* Zeile rauf, Zeile löschen */
      }
      printf("\x1b[u"); /* Gespeicherte Position wiederherstellen */
    
      return 0;
    }
    

Anmelden zum Antworten