[C++] Czyszczenie ekranu

Wszystko dla programistów. C++, Delphi, Java, PHP, SQL

[C++] Czyszczenie ekranu

PostCz gru 13, 2012 0:39

Moje pytanie dotyczy zagadnienia właśnie czyszczenia ekranów, ponieważ nie wiem jak to najlepiej zrobić zajrzałem do googla oczywiście i parę odpowiedzi znalazłem i nie wiem, ale żadna nie rozwiązała mojego problemu. Tzn. chodzi mi o to że chcę zapętlić wyświetlanie napisu, ale tak aby wyświetlana była tylko jego jedna wersja na ekranie i myślałem o czymś takim(to tylko część kodu):
[code]
...
while( key != "Q"){
// Tutaj jakaś funckja czyszcząca
cout << "Napis do wyświetlenia" << endl;
}
...
[/code]

No i między innymi w googlach znalazłem odpowiedzi np. na tej stronie [url]http://www.cplusplus.com/articles/4z18T05o/[/url], ale żadna z tych funkcji nie działa tak jakbym tego chciał(biblioteki conio nawet zaincludować nie mogę). Więc miałbym prośbę o naprowadzenie na jakieś rozwiązanie. Dodam że programy piszę pod Linuksem.
Jeśli piszę posta to nie dlatego że nie umiem korzystać z wyszukiwarek internetowych.
http://www.berabbit.pl
http://www.cockroach-blog.pl [color=#0080FF]mój blog[/color]
tonapewno
user
Avatar użytkownika
Posty: 398
Dołączył(a): Cz maja 29, 2008 14:51
Lokalizacja: Ostrowiec Świętokrzyski
Podziękował: 70 razy
Podziękowano: 1 razy
Reputacja: 1737

Spokojnie - to tylko reklama - zniknie po zalogowaniu :)

Kliknij 👇


serwery VPS
Pani Reklama
Automat
Posty:
Dołączył(a): ab aeterno
Lokalizacja: UW-Zaloga

Re: [C++] Czyszczenie ekranu

PostCz gru 13, 2012 9:45

Skąd pomysł na conio? Użyj CSTDLIB.
[code]
#include <cstdlib>
int main(int argc, char *argv[])
{
system("cls");
return 0;
}
[/code]
Przykład na windowsa. W linuxie prawdopodobnie trzeba będzie zmienić cls na clear.
piszczu
user
 
Posty: 250
Dołączył(a): Śr maja 07, 2008 14:23
Podziękował: 6 razy
Podziękowano: 17 razy
Reputacja: 2982

Re: [C++] Czyszczenie ekranu

PostCz gru 13, 2012 10:05

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, da to wynik:
[code]00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|[/code]
(1b hex == 033 ofc btw)

printf("\033c"); - pełen reset konsoli, łącznie z backbufferem (to samo robi tput reset, ew reset)
(pewnie jakies inne tez sie 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ś fctlami uzyskać podobny efekt, nie sprawdzałem.

Ale... być może możesz się posłużyć czymś innym, jak np. \r:
[code]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;
}
[/code]

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,
[color=#0080FF]gynvael.coldwind[/color]//[color=#00FF00]vx[/color]
http://gynvael.coldwind.pl
Gynvael Coldwind
Przyjaciel
Avatar użytkownika
Posty: 1633
Dołączył(a): N lip 25, 2004 17:08
Podziękował: 53 razy
Podziękowano: 184 razy
Reputacja: 23041

Następujący 2 użytkownicy chcieliby podziękować Gynvael Coldwind za jego post:
D.F., tonapewno

Powrót do Programowanie

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość

cron