Как я могу очистить консоль - PullRequest
78 голосов
/ 26 июня 2011

Как в заголовке. Как очистить консоль в C ++?

Ответы [ 18 ]

62 голосов
/ 26 июня 2011

Для чистого C ++

Вы не можете.C ++ даже не имеет понятия консоли.

Программа может печатать на принтере, выводить прямо в файл или перенаправляться на вход другой программы, несмотря ни на что.Даже если бы вы могли очистить консоль в C ++, это значительно усложнило бы эти случаи.

См. Эту запись в FAQ по comp.lang.c ++:

Специфично для ОС

Если все еще имеет смысл очистить консоль в вашей программе, и вас интересуют решения для конкретной операционной системы, они существуют.

Для Windows (как в вашем теге), посмотрите эту ссылку:

Edit: этот ответ ранее упоминался с использованием system("cls");, потому что Microsoft сказала, чтобы сделать это.Однако в комментариях было отмечено, что это небезопасно делать .Из-за этой проблемы я удалил ссылку на статью Microsoft.

Библиотеки (несколько портативные)

ncurses - это библиотека, которая поддерживает манипуляции с консолью:

47 голосов
/ 27 июня 2011

Для 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просто безобразно.

15 голосов
/ 10 мая 2017

Для Linux / Unix и, возможно, некоторых других, но не для Windows до 10 TH2:

printf("\033c");

сбросит терминал.

6 голосов
/ 29 сентября 2016

вывод нескольких строк в оконную консоль бесполезен ... он просто добавляет пустые строки в нее.к сожалению, способ зависит от 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" ) );
  }
4 голосов
/ 09 мая 2015
// #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;
}
3 голосов
/ 12 марта 2016

Это действительно изменчиво, но попробуйте:

void cls() {
    for (int i = 0; i < 250; ++i) {
        std::cout << endl;
    }
}
3 голосов
/ 05 июля 2015

В Windows:

#include <cstdlib>

int main() { 
    std::system("cls");
    return 0;
}

В Linux / Unix:

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}
3 голосов
/ 29 мая 2014

Для очистки экрана сначала необходимо включить модуль:

#include <stdlib.h>

это импортирует команды Windows. Затем вы можете использовать функцию 'system' для запуска пакетных команд (которые редактируют консоль). В Windows в C ++ команда для очистки экрана будет выглядеть следующим образом:

system("CLS");

И это очистило бы консоль. Весь код будет выглядеть так:

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
system("CLS");
}

И это все, что вам нужно! Гудлак:)

3 голосов
/ 12 июня 2016

Используйте system("cls") для очистки экрана:

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
2 голосов
/ 06 мая 2017

Это трудно сделать на MAC-экране, поскольку у него нет доступа к функциям Windows, которые могут помочь очистить экран.Мое лучшее решение - зациклить и добавить строки, пока терминал не очистится, а затем запустить программу.Однако это не так эффективно и не очень удобно для памяти, если вы используете это в основном и часто.

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}
...