Jak mogę wyczyścić konsolę

92

Jak w tytule. Jak wyczyścić konsolę w C ++?

Thomas B.
źródło
Na jakim systemie operacyjnym? Jest trochę inaczej w Linuksie i Windowsie, na przykład. Jeśli chcesz to na Windows, zobacz: stackoverflow.com/questions/5866529/ ...
Jerry Coffin
Czy próbujesz wydrukować kilka linii, a następnie wyczyścić go, czy wyczyścić po każdym wierszu?
jpm
1
Czasami chcę zresetować widok konsoli. Nie chcę spamować konsoli milionami nowych linii.
Thomas B
Zapytałem, jak to zrobić w C, używając klamki konsoli. Oto odpowiedź, którą otrzymałem. Miejmy nadzieję, że pomoże to w Twojej sprawie.
Agi Hammerthief

Odpowiedzi:

71

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ą:

Merlyn Morgan-Graham
źródło
6
@Alf: Skopiowałem i wkleiłem to z artykułu MS, więc oceń ich, nie ja;) Ale naprawię to.
Merlyn Morgan-Graham
11
pochodzenie nie ma znaczenia - kod, który nawet się nie skompiluje (z g ++) jest kiepski. Ale ponieważ to naprawiłeś, wycofałem głos przeciw. :-)
Pozdrawiam i hth. - Alf
1
@YoushaAleayoub zredagował odpowiedź, aby usunąć link MS sugerujący użycie systemi dodał link do twojego artykułu wyjaśniający dlaczego.
Merlyn Morgan-Graham
53

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 systemdo tego jest po prostu brzydkie.

Cat Plus Plus
źródło
6
„Używanie systemu do tego jest po prostu brzydkie”. - Czemu? Dla mnie wygląda na czystszą :)
Merlyn Morgan-Graham
17
@ MerlynMorgan-Graham: Tworzy proces powłoki, aby wyczyścić konsolę pieprzonej konsoli. W jakim sensie jest to czyste rozwiązanie? : P To tak, jakby używać echovia system()zamiast pisać na standardowe wyjście.
Cat Plus Plus
1
Jedna liner FTW! ;) Tak, żartuję. Fakt, że tworzy on proces powłoki, jest dobrą informacją dla twojej odpowiedzi. +1 dla wersji * nix.
Merlyn Morgan-Graham
8
Używanie 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”.
JdeBP
1
Nie ma potrzeby archiwów. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS istnieje.
JdeBP
20

Dla systemu Linux / Unix i może innych, ale nie dla systemu Windows przed 10 TH2:

printf("\033c");

zresetuje terminal.

Nie anioł
źródło
14

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
}
Joma
źródło
8

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" ) );
  }
Swift - Friday Pie
źródło
5
// #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;
}
Firefox_
źródło
3

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 :)

user3179329
źródło
3
system („cls”) nie jest przenośnym rozwiązaniem tego problemu, jednak działa w systemach Windows.
CMS_95
4
To nie jest „moduł”. C ++ nie ma „modułów”. Ponadto stdlib.hjest 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.
Wyścigi lekkości na orbicie
3

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;
}
LoveToCode
źródło
2

Użyj, system("cls")aby wyczyścić ekran:

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
Wesam
źródło
2
Już wspomniano w zaakceptowanej odpowiedzi. Brak nowych informacji.
Dialecticus
Następnie pozbądź się cout / wcout i po prostu prześlij rzeczy do systemu ("echo" + twoje wyjście);
Tanveer Badar
2

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);
}
Max Goddard
źródło
2

W systemie Windows mamy wiele opcji:

  1. clrscr () (Plik nagłówkowy: conio.h)

  2. system ("cls") (Plik nagłówkowy: stdlib.h)

W Linuksie użyj system („wyczyść”) (plik nagłówkowy: stdlib.h)

Anurag Singh
źródło
Należy pamiętać, że każde wywołanie funkcji system () może stanowić problem z bezpieczeństwem.
John Doe
0

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
-1

Użyj System :: Console :: Clear ();

Spowoduje to wyczyszczenie (opróżnienie) bufora

user3882139
źródło
3
[Błąd] „System” nie został zadeklarowany.
LoveToCode,
6
To jest dla c ++ / CLI (aka .NET c ++)
FryGuy
-1
#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

jdb_jdb
źródło
To nie jest to, czego szuka OP. Przeczytaj komentarz dodany do pytania.
Agi Hammerthief
-2

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

}
OverloadedCore
źródło
-2

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!

OverloadedCore
źródło
3
Bardzo, bardzo zły sposób na zrobienie tego. Poza tym nie czyści konsoli, a jedynie dodaje puste linie. Nie zamierzam pomóc.
Vishnu Narang
Aby dodać zniewagę do obrażeń, coutmogło zostać przekierowane do pliku. Zatem nie ma w ogóle pojęcia konsoli.
Tanveer Badar
-3

użyj: clrscr ();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }
vijay
źródło
3
„Kiedyś była to funkcja w <conio.h>, w starych kompilatorach Borlanda C. Nie jest to standardowa funkcja C ++.” stackoverflow.com/a/930141/1058115
cojack
-7

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.

grafitemaster
źródło
2
Ta odpowiedź jest częstym błędem .
JdeBP