Co jest złego w:
system( "cls" );
?
Otóż zacznijmy od samego
system()
- podstawowa rzecz to to, że jeśli masz program, w którym nie masz konsoli (bo jest okienkowy albo ją sobie zamknąłeś/ukryłeś, a może przechwyciłeś inną konsolę?), to otworzy Ci się nowe okno z poleceniem, które wywołujesz i co najważniejsze - zamknie się po wywołaniu tej funkcji, a więc pisząc kilka poleceń pod sobą otworzy ci się kilka okien konsoli jedna po drugim. No cóż - nie tego się spodziewaliśmy.
Po drugie, jeżeli projektujemy aplikację konsolową, to głównie po to, aby uruchamiać ją z konsoli, czyż nie?
Jeżeli wywołujemy sobie kilka komend z konsoli, np. pod Windows polecenie
DIR
aby zorientować się w strukturze katalogu, następnie wywołamy sobie nasz program (np. gra w statki)
STATKI.EXE
, a w nim mamy
system( "cls" );
, to ku naszemu nieszczęściu, po wyjściu z programu zgubimy wszystko, co mieliśmy wcześniej w konsoli. Może i nie ma tragedii, ale znowu trzeba np. wywołać
DIR
, aby zobaczyć co też mieliśmy jeszcze w tym folderze ;)
Ale jak usuwać zawartość konsoli tylko na czas działania programu?
Rozwiązania są dwa: zachować treść konsoli sprzed uruchomienia programu i przywrócić ją przy wyjściu albo użyć stosownej biblioteki.
Pod linuxem mamy do dyspozycji potężną ncurses, która działa w dużym uproszczeniu podobnie jak Windowsowe "okienka" - mamy tzw. "screeny", które nakładają się na to, co było na konsoli i możemy bez problemu je czyścić, a po ich zamknięciu odsłonią to, co było pod nimi.
Kurs New Curses, C++Pod Windows nie ma lekko, ale są odpowiednie podobne biblioteki, np.:
http://pdcurses.sourceforge.net/ - uniwersalny
http://www.projectpluto.com/win32a.htm - pod Win32
A poza tym,
system();
jest "be" :)
Niestety, nie miałem do czynienia z tymi bibliotekami, ale jedynie z ncurses na linux.
Mam nadzieję, że wytłumaczyłem to zrozumiale.
PS. Może perspektywa użycia dodatkowej biblioteki wygląda to przerażająco, ale naprawdę nie ma się czego bać, a proste przykłady z dokumentacji powinny Ci pomóc w zrozumieniu działania i implementacji ;)