2008-10-23 10 views
25

Potrzebuję rozwiązania wieloplatformowego do czyszczenia konsoli w systemie Linux i Windows napisanej w C++. Czy są w tym jakieś funkcje? Zauważ też, że nie chcę, aby programista końcowy musiał zmienić dowolny kod w moim programie, aby usunąć go z systemu Windows w stosunku do systemu Linux (na przykład, jeśli musi wybierać między dwiema funkcjami, wtedy decyzja musi zostać podjęta w czasie wykonywania lub w czasie kompilacji autonomicznie).Jak wyczyścić konsolę w obu systemach Windows i Linux przy użyciu C++

+0

Konsola nawet nie istnieje w standardowej C++ 11, tak pedantycznie zapytanie nie nawet mieć sens. A co powiesz na przekierowany program 'foo' (np.' Foo> output.txt') lub potokowy (np. 'Foo | grep xxx')? BTW, niektóre komputery nie mają żadnych konsol (np. Większość serwerów internetowych lub VPS). –

Odpowiedz

28

Krótka odpowiedź: nie można.

Dłuższa odpowiedź: użyj biblioteki curses (ncurses w systemie Unix, pdcurses w systemie Windows). NCurses powinny być dostępne za pośrednictwem menadżera pakietów, a oba ncurses i pdcurses mają dokładnie ten sam interfejs (pdcurses mogą również tworzyć okna niezależnie od konsoli, która zachowuje się jak okna konsoli).

Najtrudniejsza odpowiedź: użyj #ifdef _WIN32 i podobnych rzeczy, aby twój kod działał inaczej w różnych systemach operacyjnych.

2

Wiem, że to nie odpowiada na moje własne pytanie, ale! To działa na Windows (#include <windows.h>):

void clrscr() 
{ 
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    COORD coord = {0, 0}; 
    DWORD count; 

    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    GetConsoleScreenBufferInfo(hStdOut, &csbi); 

    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count); 

    SetConsoleCursorPosition(hStdOut, coord); 
} 
3

ten sposób można to zrobić na innej platformie, ale to nie działa w systemie Windows:

cout << "\f"; 

Być może trzeba będzie dokonać kompilacja warunkowa:

void clrscr() 
{ 
#ifdef _WIN32 
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    COORD coord = {0, 0}; 
    DWORD count; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    GetConsoleScreenBufferInfo(hStdOut, &csbi); 
    FillConsoleOutputCharacter(hStdOut, ' ', 
           csbi.dwSize.X * csbi.dwSize.Y, 
           coord, &count); 
    SetConsoleCursorPosition(hStdOut, coord); 
#else 
    cout << "\f"; 
#endif 
} 
+0

To po prostu nie działa. \ f jest plikiem danych; nie powoduje wyczyszczenia ekranu. – coppro

+0

Nie, ale usuwa bieżącą stronę drukarki :-). – paxdiablo

49

Istnieje brak ogólnego polecenia do clear the console on both platforms.

#include <cstdlib> 

void clear_screen() 
{ 
#ifdef WINDOWS 
    std::system("cls"); 
#else 
    // Assume POSIX 
    std::system ("clear"); 
#endif 
} 
+0

znalazł tutaj http://www.daniweb.com/forums/thread95284.html – fmsf

+5

Jest to najbardziej zwięzła odpowiedź ogólnego przeznaczenia, która będzie działać w 99% wszystkich przypadków. Powinna być zaakceptowaną odpowiedzią. – Kevin

+0

http://www.cplusplus.com/articles/j3wTURfi/ Zgodnie z tym, system() nie powinien być używany ... –

13

Na Linuxie można wyczyścić konsolę. Najlepszym sposobem jest napisać następującą sekwencję ucieczki do stdout:

write(1,"\E[H\E[2J",7); 

czyli co /usr/bin/jasne robi, bez obciążania tworząc kolejny proces.

+7

Aby być czystym: [H przesuwa kursor na lewy górny róg ekranu [2J kasuje ekran Ktoś, kto chce uzyskać więcej informacji, powinien uzyskać "sekwencje specjalne ANSI" Google. –

+0

Działa to tylko dla terminali systemu Linux, które obsługują sekwencje specjalne zgodne z ANSI. –

+0

błąd: brak pasującej funkcji dla wywołania "write" write (1, "\ E [H \ E [2J", 7); // używamy tu sekwencji escape ANSI. ^ ~~~~ I zrobiłem załączniki i sprawdziłem przestrzeń nazw. –

4

Opublikowane pytanie nie podlega odpowiedzi, ponieważ nakłada niemożliwe ograniczenia. "Czyszczenie ekranu" to zupełnie inna czynność w różnych systemach operacyjnych i jak to się robi, to specyficzne dla systemu operacyjnego. Zobacz this Frequently Given Answer, aby uzyskać pełne wyjaśnienie, jak to zrobić na kilku popularnych platformach z "konsolami" i platformami z "terminalami". Znajdziesz tam również wyjaśnienie typowych błędów, których należy unikać, z których kilka jest niestety nie w porządku! — podane powyżej jako odpowiedzi.

-2

Czy nie

for (int i=0;i<1000;i++){cout<<endl;} 

jasny ekran we wszystkich systemach operacyjnych?

10

Prosta sztuczka: Dlaczego nie sprawdzić typu systemu operacyjnego przy użyciu makr w połączeniu z użyciem polecenia system() do wyczyszczenia konsoli? W ten sposób zamierzasz wykonać polecenie systemowe z odpowiednim poleceniem konsoli jako parametrem.

#ifdef _WIN32 
#define CLEAR "cls" 
#else //In any other OS 
#define CLEAR "clear" 
#endif 

//And in the point you want to clear the screen: 
//.... 
system(CLEAR); 
//.... 
1

Cóż, istnieje bardzo bliska alternatywa do czyszczenia ekranu.Możesz spróbować użyć pętli for, która bardzo często powtarza nowe linie. Na przykład:

for (i = 0; i < 100000; i++) 
{ 
    printf ("\n\n\n\n\n"); 
} 

Po wykonaniu tej pętli terminal wa nie pozwalają przejść z powrotem do miejsca, gdzie byliśmy na szczycie, nieprofesjonalne podejście ze zdrowym rozsądkiem bardzo dużo. Nie odpowiada bezpośrednio na to, o co prosisz, ale może działać.

+7

500 000 nowych linii ... lol –

+1

@leonardo_assumpcao 10³³³³³³³³³³ –

+3

wydaje się wystarczająco dla moich 5.874 km szerokości monitora –

-3

To powinno działać, jeśli pracujesz na konsoli

#include <conio.h> 

int main() 

{ 
    clrscr(); 
} 
+2

< conio.h > nie jest częścią C++ standardzie, to będzie działać tylko w TurboC++ –

+0

działa na DevC++ oraz – fidelmcscort

+0

ale nie wszystkie kompilatory, tylko kilka. Czy są jakieś conio.h na LINUX, na czym polega OP? http://stackoverflow.com/questions/8792317/why-cant-i-find-conio-h-on-linux –

1

Kod ten czyści konsoli w systemach Windows i Unix (chociaż to faktycznie skompilowany inaczej):

// File: clear_screen.h 
#ifndef _CLEAR_SCREEN_H 
#define _CLEAR_SCREEN_H 
void clearScreen(void); /* Clears the screen */ 
#endif /* _CLEAR_SCREEN_H */ 
// File: clear_screen.c 
#ifdef _WIN32 
#include <windows.h> 
void clearScreen(void) { 
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); 
    COORD topLeft = {0, 0}; 
    DWORD dwCount, dwSize; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    GetConsoleScreenBufferInfo(hOutput, &csbi); 
    dwSize = csbi.dwSize.X * csbi.dwSize.Y; 
    FillConsoleOutputCharacter(hOutput, 0x20, dwSize, topLeft, &dwCount); 
    FillConsoleOutputAttribute(hOutput, 0x07, dwSize, topLeft, &dwCount); 
    SetConsoleCursorPosition(hStdOut, topLeft); 
} 
#endif /* _WIN32 */ 

#ifdef __unix__ 
#include <stdio.h> 
void clearScreen(void) { 
    printf("\x1B[2J"); 
} 
#endif /* __unix__ */