Как в названии. Как очистить консоль в C ++?
Как в названии. Как очистить консоль в C ++?
Ответы:
Для чистого C ++
Вы не можете. В C ++ даже нет концепции консоли.
Программа может печатать на принтере, выводить прямо в файл или перенаправляться на вход другой программы во всем, что ей нужно. Даже если бы вы могли очистить консоль на C ++, это сделало бы эти случаи значительно более беспорядочными.
См. Эту запись в FAQ по comp.lang.c ++:
Для ОС
Если все еще имеет смысл очистить консоль в вашей программе, и вас интересуют решения для конкретной операционной системы, они действительно существуют.
Для Windows (как в вашем теге) перейдите по этой ссылке:
Изменить: этот ответ ранее упоминался с использованием system("cls");
, потому что Microsoft сказала это сделать. Однако в комментариях было указано, что это небезопасно . Я удалил ссылку на статью Microsoft из-за этой проблемы.
Библиотеки (несколько портативные)
ncurses - это библиотека, которая поддерживает манипуляции с консолью:
system
, и добавил ссылку на вашу статью, объясняющую, почему.
Для Windows через 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);
}
Он с радостью игнорирует все возможные ошибки, но это очистка консоли. Не то чтобы system("cls")
лучше обрабатывает ошибки.
Для * nixes вы обычно можете использовать escape-коды ANSI, так что это будет:
void clear() {
// CSI[2J clears screen, CSI[H moves the cursor to top-left corner
std::cout << "\x1B[2J\x1B[H";
}
Использовать system
для этого просто некрасиво.
echo
via system()
вместо записи в stdout.
system()
- распространенная ошибка. То же самое и ваш предлагаемый метод для Unices. Это то, что нужно делать в системах POSIX. Вы правильно поняли часть Win32, хотя и не включили соглашение о «обратной прокрутке».
Для Linux / Unix и, возможно, некоторых других, но не для Windows до 10 TH2:
printf("\033c");
сбросит терминал.
вывод нескольких строк в оконную консоль бесполезен ... он просто добавляет к нему пустые строки. к сожалению, способ специфичен для Windows и включает либо conio.h (и clrscr () может не существовать, это тоже не стандартный заголовок), либо метод 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 );
}
Для системы POSIX это проще, вы можете использовать ncurses или функции терминала.
#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" ) );
}
// #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;
}
Чтобы очистить экран, вам сначала нужно включить модуль:
#include <stdlib.h>
это импортирует команды Windows. Затем вы можете использовать «системную» функцию для запуска пакетных команд (которые редактируют консоль). В Windows на C ++ команда для очистки экрана будет следующей:
system("CLS");
И это очистит консоль. Весь код будет выглядеть так:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
И это все, что вам нужно! Удачи :)
stdlib.h
он определен стандартом C и не имеет ничего общего ни с «импортом команд Windows», ни с самой Windows. Если не считать этих придирок, все в порядке.
В Windows:
#include <cstdlib>
int main() {
std::system("cls");
return 0;
}
В Linux / Unix:
#include <cstdlib>
int main() {
std::system("clear");
return 0;
}
Используйте system("cls")
для очистки экрана:
#include <stdlib.h>
int main(void)
{
system("cls");
return 0;
}
Это сложно сделать на MAC, поскольку у него нет доступа к функциям Windows, которые могут помочь очистить экран. Лучшее решение - зациклить и добавить строки, пока терминал не очистится, а затем запустить программу. Однако это не так эффективно и не так удобно для памяти, если вы используете это в первую очередь и часто.
void clearScreen(){
int clear = 5;
do {
cout << endl;
clear -= 1;
} while (clear !=0);
}
В Windows у нас есть несколько вариантов:
clrscr () (Заголовочный файл: conio.h)
system ("cls") (Заголовочный файл: stdlib.h)
В Linux используйте system ("clear") (заголовочный файл: stdlib.h)
Вот простой способ сделать это:
#include <iostream>
using namespace std;
int main()
{
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
}
Используйте System :: Console :: Clear ();
Это очистит (опустошит) буфер
Вы можете использовать метод очистки консоли операционной системы через system ("");
для окон это будет система ("cls"); например,
и вместо выпуска трех разных кодов для разных операционных систем. просто создайте метод, чтобы узнать, какая ОС работает.
вы можете сделать это, определив, существуют ли уникальные системные переменные с помощью #ifdef,
например
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
}
редактировать: полностью переделанный вопрос
Просто проверьте, в какой системе они находятся, и отправьте системную команду в зависимости от системы. хотя это будет установлено во время компиляции
#ifdef __WIN32
system("cls");
#else
system("clear"); // most other systems use this
#endif
Это совершенно новый метод!
cout
могли быть перенаправлены в файл. Тогда вообще нет концепции консоли.
используйте: clrscr ();
#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
Самый простой способ - это многократно сбрасывать поток (в идеале больше, чем любая возможная консоль). 1024 * 1024, вероятно, размер, который никогда не может быть в окне консоли.
int main(int argc, char *argv)
{
for(int i = 0; i <1024*1024; i++)
std::cout << ' ' << std::endl;
return 0;
}
Единственная проблема с этим - программный курсор; эта мигающая вещь (или немигающая вещь) в зависимости от платформы / консоли будет находиться в конце консоли, а не в ее верхней части. Однако, надеюсь, это никогда не вызовет никаких проблем.