[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
00000000  1b 5b 48 1b 5b 32 4a                              |.[H.[2J|

(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>
#include <unistd.h>

int
main(void) {
  int i;
  for(i = 0; i < 100; i++) {
    printf(" ------> %i\r", i); fflush(stdout);
    usleep(250 * 1000);
  }
  puts(" ------> DONE"); 

  return 0;
}


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,
【 design & art by Xa / Gynvael Coldwind 】 【 logo font (birdman regular) by utopiafonts / Dale Harris 】