Как очистить консоль в обоих Windows и Linux, используя C ++

StackOverflow https://stackoverflow.com/questions/228617

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}

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

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

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

Простой трюк: почему бы не проверить тип ОС с помощью макросов в сочетании с командой 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);
//....

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

Вот как вы это делаете на любой другой платформе, но она не работает в 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
}

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

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

Длинный ответ , прочитайте

системное (" pause ") разъяснение

Я знаю, что это не ответ на мой собственный вопрос, но! Это работает для 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);
}

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

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

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

Этот код очищает консоль в ОБА 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__ */

Не будет

for (int i=0;i<1000;i++){cout<<endl;}

очистить экран во всех ОС?

Это должно работать, если вы работаете в консоли

#include <conio.h>

int main()

{
    clrscr();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top