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++
Odpowiedz
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.
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);
}
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
}
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
}
znalazł tutaj http://www.daniweb.com/forums/thread95284.html – fmsf
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
http://www.cplusplus.com/articles/j3wTURfi/ Zgodnie z tym, system() nie powinien być używany ... –
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.
Aby być czystym:
Działa to tylko dla terminali systemu Linux, które obsługują sekwencje specjalne zgodne z ANSI. –
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. –
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.
Czy nie
for (int i=0;i<1000;i++){cout<<endl;}
jasny ekran we wszystkich systemach operacyjnych?
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);
//....
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ć.
500 000 nowych linii ... lol –
@leonardo_assumpcao 10³³³³³³³³³³ –
wydaje się wystarczająco dla moich 5.874 km szerokości monitora –
To powinno działać, jeśli pracujesz na konsoli
#include <conio.h>
int main()
{
clrscr();
}
< conio.h > nie jest częścią C++ standardzie, to będzie działać tylko w TurboC++ –
działa na DevC++ oraz – fidelmcscort
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 –
Krótka odpowiedź
void cls(void)
{
system("cls||clear");
return;
}
długa odpowiedź, proszę przeczytać:
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__ */
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). –