Как очистить консоль в ОБЕИХ ОС Windows и Linux с помощью C++

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

Консоль даже не существует в стандарте C++ 11, так что ваш вопрос не имеет никакого смысла педантично. А как насчет перенаправления вашей программы foo (например, foo > output.txt) или конвейерной обработки (например, foo | grep xxx)? Кстати, на некоторых компьютерах нет консолей (например, большинство веб-серверов или VPS)

Basile Starynkevitch 21.11.2017 09:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
27
1
59 465
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

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

Короткий ответ: нельзя.

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

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

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

Это просто не работает. \ f - подача формы; он не очищает экран.

coppro 23.10.2008 09:34

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

#include <cstdlib>

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

Это наиболее краткий универсальный ответ, который будет работать в 99% всех случаев. Должен быть принятый ответ.

Kevin 28.11.2013 08:25
cplusplus.com/articles/j3wTURfi Согласно этому, system () не должна использоваться ...
arc_lupus 15.09.2014 14:41

@fmsf Что бы вы сказали об этом ответе stackoverflow.com/a/33992073/5473170?

Suraj Jain 25.02.2017 06:07

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

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

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

Для ясности: <ESC> [H перемещает курсор в верхний левый угол экрана. <ESC> [2J стирает экран. Любой, кто хочет получить более подробную информацию, должен погуглить "escape-последовательности ANSI".

Stéphane 18.12.2008 00:25

Это работает только для терминалов Linux, которые поддерживают ANSI-совместимые escape-последовательности.

Lee D 20.01.2012 08:34

ошибка: нет соответствующей функции для вызова 'write' write (1, "\ E [H \ E [2J", 7); // здесь мы используем escape-последовательности ANSI. ^ ~~~~ И я включил и проверил пространство имен.

Eduardo Reis 11.06.2014 21:13

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

Не стал бы

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

очистить экран во всех операционках?

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

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

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

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

@leonardo_assumpcao 10³³³³³³³³³³

Martin Pfeffer 04.11.2015 20:13

Кажется, достаточно для моего монитора шириной 5,874 км.

leonardo_assumpcao 10.07.2016 20:25

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

#include <conio.h>

int main()

{
    clrscr();
}

<conio.h> не является частью стандарта C++, он будет работать только в Turbo C++

Arun A S 21.02.2015 08:04

но не все компиляторы, а всего несколько. Есть ли в LINUX какой-либо conio.h, о чем заботится ОП? stackoverflow.com/questions/8792317/…

phuclv 22.02.2015 12:52

и ваш код не может даже скомпилироваться в Windows / MSDOS, прежде чем я его отредактировал

phuclv 22.02.2015 12:56

conio.h - очень старая устаревшая библиотека для 16-битных компиляторов, которая в современных системах не рекомендуется.

HaseeB Mir 24.09.2018 13:51

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

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

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

системное ("пауза") уточнение

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

Как уже говорили другие, нет возможности иметь один идентичный фрагмент кода, который очищает консоль как в Windows, так и в Linux.

Я также рекомендую сильно не использовать std::system:

  • делает вашу программу уязвимой для атак; что, если кто-то заменит clear / cls своей вредоносной программой
  • как следствие вышесказанного, антивирусные программы ненавидят std::system. Если ваш код использует его, полученный двоичный файл может дать положительный результат на наличие вируса, даже если он должен быть безвредным. (Обратите внимание, что на самом деле нет безвреден.)

Вот мое решение:

#ifdef _WIN32
#include <Windows.h>
#endif

void clrscr() {
#ifdef _WIN32
    COORD tl = { 0,0 };
    CONSOLE_SCREEN_BUFFER_INFO s;
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(console, &s);
    DWORD written, cells = s.dwSize.X * s.dwSize.Y;
    FillConsoleOutputCharacter(console, ' ', cells, tl, &written);
    FillConsoleOutputAttribute(console, s.wAttributes, cells, tl, &written);
    SetConsoleCursorPosition(console, tl);
#else
    std::cout << "\033[2J\033[1; 1H";
#endif
}

Вы можете следовать схеме, показанной выше, и изменять два сегмента кода по своему усмотрению.

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