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


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.