[PL] FAQ: czyszczenie ekranu konsoli, Linux (last update: 2012-12-13, created: 2012-12-13) back to the list ↑
|
|||
[FAQ - pytania (które dostaje via e-mail/IRC/jabber/etc, oraz na które natrafiam na forach) + moje odpowiedzi]
Topic z forum uw-team.org; autor pyta o dwie rzeczy: 1. Jak wyczyścić ekran pod Linuxem. 2. Jak "animować" jedną linijkę tekstu (metodą write→delay→clear→repeat). Moja odpowiedź poniżej: Najgorsze co możesz zrobić to np. system("cls") ew system("clear") - jest to wolne, wymaga spawnowania innego procesu, uruchomianie shella, wykonania skryptu startowego shella, po czym wywołania faktycznej komendy, deinicjalizacji wszystkiego i zamknięciu procesu; dodatkowo znane są przypadku błędów bezpieczeństwa związanych z użyciem system(), więc nie jest to zbyt szczęśliwy nawyk. Nie tędy droga :) Konsole linuxowe obsługują tzw. terminal control codes (aka ANSI escape codes) które przesyła się via stdout. Kodów czyszczących konsole jest kilka, i działają trochę inaczej (np, nie każdy czyści back buffer). printf("\033[2J"); - clear, ale bez zmiany koordynatów kursora printf("\033[H\033[2J"); - wg infocmp; clear ze zresetowaniem koordynatów kursora - tego używa clear konsolowy, co zresztą można łatwo sprawdzić wydając polecenie: clear | hexdump -C (1b hex == 033 ofc btw) printf("\033c"); - pełen reset konsoli, łącznie z backbufferem (to samo robi tput reset, ew reset) (pewnie jakieś inne też się znajdą) Możesz na wszelki wypadek dać fflush(stdout) po danym printf z kodem. Druga metoda to skorzystanie z putp/tigetstr/etc - jest opisana w linku który dałeś, i u mnie działa dobrze (natomiast de facto, sprowadza się to i tak do tego kodu wyżej). http://www.cplusplus.com/articles/4z18T05o/#POSIX (natomiast ta metoda nie czyści back buffera) Być może da się też jakimiś ioctl/fcntl uzyskać podobny efekt, nie sprawdzałem. Ale... być może możesz się posłużyć czymś innym, jak np. \r: include <stdio.h> Ew rzuć okiem na inne terminal control codes, np. \033[K który czyści daną linie. Rzuć okiem też na http://www.termsys.demon.co.uk/vtansi.htm#erase i inne strony ze spisem control codes (http://www.xfree86.org/current/ctlseqs.html jest chyba najbardziej pełna, przy czym nie każdy terminal wszystkie supportuje, a niektóre terminale supportują jeszcze inne). Cheers, | |||
|