Jak w tytule. Jak wyczyścić konsolę w C ++?
c++
windows
console-application
dev-c++
Thomas B.
źródło
źródło
Odpowiedzi:
Dla czystego C ++
Nie możesz. C ++ nie ma nawet koncepcji konsoli.
Program może drukować na drukarce, wysyłać bezpośrednio do pliku lub być przekierowywany do wejścia innego programu na wszystko, na czym mu zależy. Nawet gdybyś mógł wyczyścić konsolę w C ++, spowodowałoby to znacznie większy bałagan.
Zobacz ten wpis w FAQ comp.lang.c ++:
Specyficzne dla systemu operacyjnego
Jeśli wyczyszczenie konsoli w programie nadal ma sens, a interesują Cię rozwiązania specyficzne dla systemu operacyjnego, takie istnieją.
W przypadku systemu Windows (jak w tagu) sprawdź ten link:
Edycja: ta odpowiedź wcześniej wspomniała o użyciu
system("cls");
, ponieważ Microsoft powiedział, że to zrobi. Jednak w komentarzach wskazano, że nie jest to bezpieczne . Usunąłem łącze do artykułu firmy Microsoft z powodu tego problemu.Biblioteki (nieco przenośne)
ncurses to biblioteka obsługująca manipulowanie konsolą:
źródło
system
i dodał link do twojego artykułu wyjaśniający dlaczego.W przypadku systemu Windows za pośrednictwem konsoli API:
void clear() { COORD topLeft = { 0, 0 }; HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO screen; DWORD written; GetConsoleScreenBufferInfo(console, &screen); FillConsoleOutputCharacterA( console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written ); FillConsoleOutputAttribute( console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE, screen.dwSize.X * screen.dwSize.Y, topLeft, &written ); SetConsoleCursorPosition(console, topLeft); }
Na szczęście ignoruje wszystkie możliwe błędy, ale hej, to czyszczenie konsoli. Nie
system("cls")
lepiej radzi sobie z błędami.W przypadku * nixes zwykle można użyć kodów ucieczki ANSI, więc będzie to:
void clear() { // CSI[2J clears screen, CSI[H moves the cursor to top-left corner std::cout << "\x1B[2J\x1B[H"; }
Używanie
system
do tego jest po prostu brzydkie.źródło
echo
viasystem()
zamiast pisać na standardowe wyjście.system()
jest częstym błędem. Więc jest to również twoja sugerowana metoda dla Unices. To właśnie należy zrobić w systemach POSIX. Część dla Win32 została dobrze utworzona, chociaż nie uwzględniono konwencji „przewijania wstecz”.Dla systemu Linux / Unix i może innych, ale nie dla systemu Windows przed 10 TH2:
printf("\033c");
zresetuje terminal.
źródło
Najłatwiejszy sposób bez konieczności odkrywania na nowo koła.
void Clear() { #if defined _WIN32 system("cls"); #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__) system("clear"); #elif defined (__APPLE__) system("clear"); #endif }
źródło
wysyłanie wielu wierszy do konsoli okna jest bezużyteczne… po prostu dodaje do niego puste wiersze. niestety metoda way jest specyficzna dla systemu Windows i obejmuje conio.h (a clrscr () może nie istnieć, to też nie jest standardowy nagłówek) lub metodę Win API
#include <windows.h> void ClearScreen() { HANDLE hStdOut; CONSOLE_SCREEN_BUFFER_INFO csbi; DWORD count; DWORD cellCount; COORD homeCoords = { 0, 0 }; hStdOut = GetStdHandle( STD_OUTPUT_HANDLE ); if (hStdOut == INVALID_HANDLE_VALUE) return; /* Get the number of cells in the current buffer */ if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return; cellCount = csbi.dwSize.X *csbi.dwSize.Y; /* Fill the entire buffer with spaces */ if (!FillConsoleOutputCharacter( hStdOut, (TCHAR) ' ', cellCount, homeCoords, &count )) return; /* Fill the entire buffer with the current colors and attributes */ if (!FillConsoleOutputAttribute( hStdOut, csbi.wAttributes, cellCount, homeCoords, &count )) return; /* Move the cursor home */ SetConsoleCursorPosition( hStdOut, homeCoords ); }
W przypadku systemu POSIX jest to znacznie prostsze, możesz użyć ncurses lub funkcji terminala
#include <unistd.h> #include <term.h> void ClearScreen() { if (!cur_term) { int result; setupterm( NULL, STDOUT_FILENO, &result ); if (result <= 0) return; } putp( tigetstr( "clear" ) ); }
źródło
// #define _WIN32_WINNT 0x0500 // windows >= 2000 #include <windows.h> #include <iostream> using namespace std; void pos(short C, short R) { COORD xy ; xy.X = C ; xy.Y = R ; SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), xy); } void cls( ) { pos(0,0); for(int j=0;j<100;j++) cout << string(100, ' '); pos(0,0); } int main( void ) { // write somthing and wait for(int j=0;j<100;j++) cout << string(10, 'a'); cout << "\n\npress any key to cls... "; cin.get(); // clean the screen cls(); return 0; }
źródło
Aby wyczyścić ekran, musisz najpierw dołączyć moduł:
#include <stdlib.h>
spowoduje to zaimportowanie poleceń systemu Windows. Następnie możesz użyć funkcji „system” do uruchamiania poleceń wsadowych (edytujących konsolę). W systemie Windows w C ++ polecenie wyczyszczenia ekranu wyglądałoby tak:
system("CLS");
A to wyczyściłoby konsolę. Cały kod wyglądałby tak:
#include <iostream> #include <stdlib.h> using namespace std; int main() { system("CLS"); }
I to wszystko, czego potrzebujesz! Powodzenia :)
źródło
stdlib.h
jest określony przez standard C i nie ma nic wspólnego z „importowaniem poleceń systemu Windows” ani nawet z samym systemem Windows. Poza tym czepianiem się, jesteś w porządku.W systemie Windows:
#include <cstdlib> int main() { std::system("cls"); return 0; }
W systemie Linux / Unix:
#include <cstdlib> int main() { std::system("clear"); return 0; }
źródło
Użyj,
system("cls")
aby wyczyścić ekran:#include <stdlib.h> int main(void) { system("cls"); return 0; }
źródło
Jest to trudne do zrobienia na komputerze MAC, ponieważ nie ma on dostępu do funkcji systemu Windows, które mogą pomóc w wyczyszczeniu ekranu. Moim najlepszym rozwiązaniem jest zapętlenie i dodawanie wierszy, aż terminal będzie czysty, a następnie uruchom program. Jednak nie jest to tak wydajne ani przyjazne dla pamięci, jeśli używasz tego głównie i często.
void clearScreen(){ int clear = 5; do { cout << endl; clear -= 1; } while (clear !=0); }
źródło
W systemie Windows mamy wiele opcji:
clrscr () (Plik nagłówkowy: conio.h)
system ("cls") (Plik nagłówkowy: stdlib.h)
W Linuksie użyj system („wyczyść”) (plik nagłówkowy: stdlib.h)
źródło
Oto prosty sposób na zrobienie tego:
#include <iostream> using namespace std; int main() { cout.flush(); // Flush the output stream system("clear"); // Clear the console with the "system" function }
źródło
Użyj System :: Console :: Clear ();
Spowoduje to wyczyszczenie (opróżnienie) bufora
źródło
#include <cstdlib> void cls(){ #if defined(_WIN32) //if windows system("cls"); #else system("clear"); //if other #endif //finish
}
Wystarczy wywołać cls () w dowolnym miejscu
źródło
Możesz użyć przejrzystej metody konsoli systemu operacyjnego za pośrednictwem systemu („”);
dla Windows byłby to system ("cls"); na przykład
i zamiast wydawać trzy różne kody dla różnych systemów operacyjnych. po prostu utwórz metodę, aby uzyskać działający system operacyjny.
możesz to zrobić, wykrywając, czy istnieją unikalne zmienne systemowe z #ifdef,
np
enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/}; void getOs(){ #ifdef _WIN32 return OPERATINGSYSTEM.windows #elif __APPLE__ //etc you get the point #endif } int main(){ int id = getOs(); if(id == OPERATINGSYSTEM.windows){ system("CLS"); }else if (id == OPERATINGSYSTEM.mac){ system("CLEAR"); } //etc you get the point }
źródło
edycja: całkowicie przerobione pytanie
Po prostu sprawdź, w jakim systemie są włączone i wyślij polecenie systemowe w zależności od systemu. chociaż zostanie to ustawione w czasie kompilacji
#ifdef __WIN32 system("cls"); #else system("clear"); // most other systems use this #endif
To zupełnie nowa metoda!
źródło
cout
mogło zostać przekierowane do pliku. Zatem nie ma w ogóle pojęcia konsoli.użyj: clrscr ();
#include <iostream> using namespace std; int main() { clrscr(); cout << "Hello World!" << endl; return 0; }
źródło
Najłatwiejszym sposobem byłoby wielokrotne opróżnianie strumienia (najlepiej większe niż jakakolwiek możliwa konsola) 1024 * 1024 to rozmiar, którego nie mogłoby nigdy mieć okno konsoli.
int main(int argc, char *argv) { for(int i = 0; i <1024*1024; i++) std::cout << ' ' << std::endl; return 0; }
Jedynym problemem jest kursor programowy; ta migająca rzecz (lub niemigająca rzecz) w zależności od platformy / konsoli będzie na końcu konsoli, a nie na jej górnej części. Jednak, miejmy nadzieję, nie powinno to nigdy powodować żadnych problemów.
źródło