Як я можу очистити консоль


93

Як у назві. Як я можу очистити консоль у C ++?


На якій ОС? Це зовсім інше в Linux проти Windows, лише для одного прикладу. Якщо ви хочете це для Windows, див .: stackoverflow.com/questions/5866529/…
— Джеррі Коффін

Ви намагаєтесь надрукувати купу рядків, а потім очистити її, або очистити після кожного рядка?
— jpm

1
Я хочу інколи скинути вигляд консолі. Я не хочу спамувати консоль з мільйонами нових рядків.
— Thomas B

Я запитав, як це зробити в C, використовуючи дескриптор вікна консолі. Це відповідь, яку я отримав. Сподіваємось, це допоможе у вашій справі.
— Agi Hammerthief

Відповіді:


72

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

Ви не можете. C ++ навіть не має поняття консолі.

Програма може друкувати на принтері, виводити безпосередньо у файл або перенаправляти на вхід іншої програми для всіх, про що вона турбується. Навіть якби ви змогли очистити консоль у C ++, це зробило б ці справи суттєвішими.

Дивіться цей запис у поширених запитаннях comp.lang.c ++:

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

Якщо все-таки є сенс очистити консоль у вашій програмі, і ви зацікавлені у вирішенні конкретних операційних систем, вони справді існують.

Для Windows (як у вашому тегу) перевірте це посилання:

Редагувати: Ця відповідь, згадана раніше, була використана system("cls");, оскільки Microsoft сказала, що це потрібно зробити. Однак у коментарях зазначалося, що це не безпечно робити . Через цю проблему я видалив посилання на статтю Microsoft.

Бібліотеки (дещо портативні)

ncurses - це бібліотека, яка підтримує маніпуляції з консоллю:


6
@Alf: Я скопіював це з статті MS, тому віддайте голос їм, а не мені;) Я все ж це виправлю.
— Merlyn Morgan-Graham

11
походження не має значення - код, який навіть не компілюється (з g ++), є недобрим. Але оскільки ви це виправили, я видалив голос проти. :-)
— Вітаю та hth. - Альф

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, як правило, ви можете скористатися кодами захисту 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

20

Для Linux / Unix і, можливо, деяких інших, але не для Windows до 10 TH2:

printf("\033c");

скине термінал.


15

Мені найпростіший спосіб без необхідності винаходити колесо заново.

void Clear()
{
#if defined _WIN32
    system("cls");
    //clrscr(); // including header file : conio.h
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
    //std::cout<< u8"\033[2J\033[1;1H"; //Using ANSI Escape Sequences 
#elif defined (__APPLE__)
    system("clear");
#endif
}
  • У Windows ви можете використовувати заголовок "conio.h" і викликати функцію clrscr, щоб уникнути використання системних функцій .
#include <conio.h>
clrscr();
  • У Linux ви можете використовувати послідовності ANSI Escape, щоб уникнути використання системних функцій. Перевірте це посилання ANSI Escape Sequences
    std::cout<< u8"\033[2J\033[1;1H"; 
  • Про розслідування MacOS ...

Не працює у мене: друкTERM environment variable not set.
— secavfr

@secavfr перевірте оновлення.
— Джома

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" ) );
  }

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;
}

3

Щоб очистити екран, спочатку потрібно буде включити модуль:

#include <stdlib.h>

це імпортує команди windows. Потім ви можете використовувати функцію "система" для запуску командних команд (які редагують консоль). У Windows на C ++ команда для очищення екрана буде такою:

system("CLS");

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

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

using namespace std;

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

І це все, що вам потрібно! Удачі :)


3
system ("cls") не є портативним рішенням цієї проблеми, однак вона працює в системах Windows.
— CMS_95

4
Це не "модуль". C ++ не має "модулів". Крім того, stdlib.hце визначено стандартом С і не має нічого спільного ні з "імпортом команд windows", ні навіть із самою Windows. Окрім цього нікчемного, ти в порядку.
— Гонки легкості на орбіті

3

У Windows:

#include <cstdlib>

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

У Linux / Unix:

#include <cstdlib>

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

3

Це важко зробити на MAC, оскільки він не має доступу до функцій Windows, які можуть допомогти очистити екран. Моє найкраще виправлення - це петля і додавання рядків, поки термінал не стане чистим, а потім запуск програми. Однак це не настільки ефективно або зручно пам’яті, якщо ви використовуєте це переважно і часто.

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

2

Використовуйте system("cls")для очищення екрана:

#include <stdlib.h>

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

2
Вже згадано у прийнятій відповіді. Тут немає нової інформації.
— Dialecticus

Потім позбудьтеся cout / wcout і просто передайте речі в систему ("ехо" + ваш результат);
— Tanveer Badar

2

У Windows ми маємо кілька варіантів:

  1. clrscr () (Файл заголовка: conio.h)

  2. system ("cls") (Файл заголовка: stdlib.h)

У Linux використовуйте систему ("очистити") (Заголовок: 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
#include <cstdlib>

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

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

}

Просто зателефонуйте cls () куди завгодно


Це не те, що шукає ОП. Прочитайте коментар, доданий до запитання.
— Agi Hammerthief

-2

Ви можете скористатися методом прозорої консолі операційної системи через систему ("");
для вікон це була б система ("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

}

-2

редагувати: повністю перероблене питання

Просто перевірте, в якій системі вони працюють, і надішліть системну команду залежно від системи. хоча це буде встановлено під час компіляції

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

Це абсолютно новий метод!


3
Дуже дуже поганий спосіб це зробити. Плюс це не очищення консолі, це лише додавання порожніх рядків. Не збираюся допомагати.
— Вішну Наранг

Щоб додати образи до травми, coutможливо, було перенаправлено до файлу. Тоді поняття консолі взагалі не існує.
— Tanveer Badar

-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,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.