Как очистить консоль

92

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

Томас Б.
источник
На какой ОС? Это немного отличается в Linux от Windows, только для одного примера. Если вам это нужно для Windows, см .: stackoverflow.com/questions/5866529/…
Джерри Коффин,
Вы пытаетесь напечатать несколько строк, а затем очистить их или очистить после каждой строки?
jpm
1
Иногда я хочу сбросить вид консоли. Я не хочу спамить консоль миллионами новых строк.
Thomas B
Я спросил, как это сделать в C, используя дескриптор окна консоли. Это ответ, который я получил. Надеюсь, это поможет в вашем случае.
Agi

Ответы:

71

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

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

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

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

Для ОС

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

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

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

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

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

Мерлин Морган-Грэм
источник
6
@Alf: Я скопировал вставку из статьи MS, так что голосуйте против них, а не меня;) Я исправлю это.
Мерлин Морган-Грэм
11
происхождение не имеет значения - код, который даже не компилируется (с g ++), не подходит. Но поскольку вы это исправили, я снял голос против. :-)
Ура и hth. - Alf
1
@YoushaAleayoub отредактировал ответ, чтобы удалить ссылку MS, предлагающую использовать system, и добавил ссылку на вашу статью, объясняющую, почему.
Мерлин Морган-Грэм
53

Для 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для этого просто некрасиво.

Кошка Плюс Плюс
источник
6
«Использовать систему для этого просто некрасиво». - Зачем? Конечно, для меня выглядит чище :)
Мерлин Морган-Грэм
17
@ MerlynMorgan-Graham: Он запускает процесс оболочки, чтобы очистить чертову консоль. В каком смысле это чистое решение? : P Это похоже на использование echovia system()вместо записи в stdout.
Cat Plus Plus
1
Один лайнер FTW! ;) Да, я шучу. Тот факт, что он порождает процесс оболочки, является хорошей информацией для вашего ответа. +1 для версии * nix.
Мерлин Морган-Грэм
8
Использование system()- распространенная ошибка. То же самое и ваш предлагаемый метод для Unices. Это то, что нужно делать в системах POSIX. Вы правильно поняли часть Win32, хотя и не включили соглашение о «обратной прокрутке».
JdeBP
1
Нет необходимости в архивах. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS существует.
JdeBP 08
20

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

printf("\033c");

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

Нет, ангел
источник
14

Для меня это самый простой способ без необходимости изобретать велосипед.

void Clear()
{
#if defined _WIN32
    system("cls");
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
#elif defined (__APPLE__)
    system("clear");
#endif
}
Joma
источник
8

вывод нескольких строк в оконную консоль бесполезен ... он просто добавляет к нему пустые строки. к сожалению, способ специфичен для 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" ) );
  }
Swift - Пятничный пирог
источник
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;
}
Fire Fox_
источник
3

Чтобы очистить экран, вам сначала нужно включить модуль:

#include <stdlib.h>

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

system("CLS");

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

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

using namespace std;

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

И это все, что вам нужно! Удачи :)

user3179329
источник
3
system ("cls") не является переносимым решением этой проблемы, но работает в системах Windows.
CMS_95,
4
Это не «модуль». В C ++ нет «модулей». Более того, stdlib.hон определен стандартом C и не имеет ничего общего ни с «импортом команд Windows», ни с самой Windows. Если не считать этих придирок, все в порядке.
Гонки легкости на орбите,
3

В Windows:

#include <cstdlib>

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

В Linux / Unix:

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}
LoveToCode
источник
2

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

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
Весам
источник
2
Уже упоминалось в принятом ответе. Здесь нет новой информации.
Dialecticus
Затем избавьтесь от cout / wcout и просто перенаправьте данные в систему ("echo" + ваш вывод);
Танвир Бадар
2

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

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}
Макс Годдард
источник
2

В Windows у нас есть несколько вариантов:

  1. clrscr () (Заголовочный файл: conio.h)

  2. system ("cls") (Заголовочный файл: stdlib.h)

В Linux используйте system ("clear") (заголовочный файл: stdlib.h)

Анураг Сингх
источник
Обратите внимание, что любой вызов system () может быть проблемой безопасности.
Джон Доу
0

Вот простой способ сделать это:

#include <iostream>

using namespace std;

int main()
{
    cout.flush(); // Flush the output stream
    system("clear"); // Clear the console with the "system" function
}

источник
-1

Используйте System :: Console :: Clear ();

Это очистит (опустошит) буфер

user3882139
источник
3
[Ошибка] «Система» не объявлена.
LoveToCode 05
6
Это для c ++ / CLI (он же .NET c ++)
FryGuy
-1
#include <cstdlib>

void cls(){
#if defined(_WIN32) //if windows
    system("cls");

#else
    system("clear");    //if other
#endif  //finish

}

Просто вызовите cls () где угодно

jdb_jdb
источник
Это не то, что ищет OP. Прочтите комментарий, добавленный к вопросу.
Agi
-2

Вы можете использовать метод очистки консоли операционной системы через 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

}
OverloadedCore
источник
-2

редактировать: полностью переделанный вопрос

Просто проверьте, в какой системе они находятся, и отправьте системную команду в зависимости от системы. хотя это будет установлено во время компиляции

#ifdef __WIN32
    system("cls");
#else
    system("clear"); // most other systems use this
#endif

Это совершенно новый метод!

OverloadedCore
источник
3
Очень-очень плохой способ сделать это. Плюс это не очищает консоль, а только добавляет пустые строки. Не поможет.
Вишну Наранг
Чтобы добавить оскорбления к травме, coutмогли быть перенаправлены в файл. Тогда вообще нет концепции консоли.
Танвир Бадар
-3

используйте: clrscr ();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }
виджей
источник
3
«Раньше это была функция в <conio.h> старых компиляторов Borland C. Это не стандартная функция C ++». stackoverflow.com/a/930141/1058115
cojack
-7

Самый простой способ - это многократно сбрасывать поток (в идеале больше, чем любая возможная консоль). 1024 * 1024, вероятно, размер, который никогда не может быть в окне консоли.

int main(int argc, char *argv)
{
  for(int i = 0; i <1024*1024; i++)
      std::cout << ' ' << std::endl;

  return 0;
}

Единственная проблема с этим - программный курсор; эта мигающая вещь (или немигающая вещь) в зависимости от платформы / консоли будет находиться в конце консоли, а не в ее верхней части. Однако, надеюсь, это никогда не вызовет никаких проблем.

графитмастер
источник
2
Этот ответ - распространенная ошибка .
JdeBP