Как очистить консоль в обоих Windows и Linux, используя C ++ - PullRequest
26 голосов
/ 23 октября 2008

Мне нужно кроссплатформенное решение для очистки консоли в Linux и Windows, написанное на C ++. Есть ли какие-либо функции в этом? Также обратите внимание, что я не хочу, чтобы программист конечного пользователя должен был изменять какой-либо код в моей программе, чтобы он стал понятным для Windows против Linux (например, если ему приходится выбирать между двумя функциями, то решение должно быть принято во время выполнения или во время компиляции автономно).

Ответы [ 12 ]

53 голосов
/ 23 октября 2008

Нет общей команды для очистки консоли на обеих платформах .

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}
28 голосов
/ 23 октября 2008

Краткий ответ: вы не можете.

Более длинный ответ: используйте библиотеку curses (ncurses в Unix, pdcurses в Windows). NCurses должны быть доступны через ваш менеджер пакетов, и ncurses и pdcurses имеют одинаковый интерфейс (pdcurses также может создавать окна независимо от консоли, которые ведут себя как окна консоли).

Самый сложный ответ: используйте #ifdef _WIN32 и тому подобное, чтобы заставить ваш код работать по-разному в разных операционных системах.

13 голосов
/ 05 ноября 2008

В Linux можно очистить консоль. Самый лучший способ - написать следующую escape-последовательность в stdout:

write(1,"\E[H\E[2J",7);

, что делает / usr / bin / clear , без дополнительных затрат на создание другого процесса.

10 голосов
/ 18 марта 2013

Простой трюк: почему бы не проверить тип ОС с помощью макросов в сочетании с командой system () для очистки консоли? Таким образом, вы собираетесь выполнить системную команду с соответствующей консольной командой в качестве параметра.

#ifdef _WIN32
#define CLEAR "cls"
#else //In any other OS
#define CLEAR "clear"
#endif

//And in the point you want to clear the screen:
//....
system(CLEAR);
//....
4 голосов
/ 22 февраля 2011

Вопрос в том виде, в котором он был опубликован, не подлежит обсуждению, поскольку накладывает невозможные ограничения. «Очистка экрана» - это совершенно разное действие в разных операционных системах, и то, как это делается , зависит от операционной системы. См. этот часто задаваемый ответ для полного объяснения того, как это сделать на нескольких популярных платформах с "консолями" и платформах с "терминалами". Там же вы найдете объяснение распространенных ошибок, некоторые из которых & mdash; Увы! & Mdash; приведены выше в качестве ответов.

3 голосов
/ 30 ноября 2015

Краткий ответ

void cls(void)
{
    system("cls||clear");
    return;
}

Длинный ответ , пожалуйста, прочитайте:

разъяснение системы («пауза»)

3 голосов
/ 23 октября 2008

Вот как вы делаете это на любой другой платформе, но она не работает в Windows:

cout << "\f";

Возможно, вам потребуется условная компиляция:

void clrscr()
{
#ifdef _WIN32
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    FillConsoleOutputCharacter(hStdOut, ' ',
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coord, &count);
    SetConsoleCursorPosition(hStdOut, coord);
#else
    cout << "\f";
#endif
}
2 голосов
/ 23 октября 2008

Я знаю, что это не ответ на мой собственный вопрос, но! Это работает для Windows (#include <windows.h>):

void clrscr()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);

    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

    SetConsoleCursorPosition(hStdOut, coord);
}
1 голос
/ 21 ноября 2017

Этот код очищает консоль в ОБА Windows и Unix (хотя на самом деле он скомпилирован по-разному):

// File: clear_screen.h
#ifndef _CLEAR_SCREEN_H
#define _CLEAR_SCREEN_H
void clearScreen(void); /* Clears the screen */
#endif /* _CLEAR_SCREEN_H */
// File: clear_screen.c
#ifdef _WIN32
#include <windows.h>
void clearScreen(void) {
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD topLeft = {0, 0};
    DWORD dwCount, dwSize;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hOutput, &csbi);
    dwSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hOutput, 0x20, dwSize, topLeft, &dwCount);
    FillConsoleOutputAttribute(hOutput, 0x07, dwSize, topLeft, &dwCount);
    SetConsoleCursorPosition(hOutput, topLeft);
}
#endif /* _WIN32 */

#ifdef __unix__
#include <stdio.h>
void clearScreen(void) {
    printf("\x1B[2J");
}
#endif /* __unix__ */
1 голос
/ 21 февраля 2015

Ну, есть очень близкая альтернатива очистке экрана. Вы можете попробовать использовать цикл for, который многократно повторяет новые строки. Например:

for (i = 0; i < 100000; i++)
{
  printf ("\n\n\n\n\n");
}

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

...