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





Я знаю, что это не ответ на мой собственный вопрос, но!
Это работает для 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 - подача формы; он не очищает экран.
Для очистить консоль на обеих платформах нет общей команды.
#include <cstdlib>
void clear_screen()
{
#ifdef WINDOWS
std::system("cls");
#else
// Assume POSIX
std::system ("clear");
#endif
}
Это наиболее краткий универсальный ответ, который будет работать в 99% всех случаев. Должен быть принятый ответ.
@fmsf Что бы вы сказали об этом ответе stackoverflow.com/a/33992073/5473170?
В linux можно очистить консоль. Лучший способ - записать в стандартный вывод следующую escape-последовательность:
write(1,"\E[H\E[2J",7);
что и делает / usr / bin / clear, без накладных расходов на создание другого процесса.
Для ясности: <ESC> [H перемещает курсор в верхний левый угол экрана. <ESC> [2J стирает экран. Любой, кто хочет получить более подробную информацию, должен погуглить "escape-последовательности ANSI".
Это работает только для терминалов Linux, которые поддерживают ANSI-совместимые escape-последовательности.
ошибка: нет соответствующей функции для вызова 'write' write (1, "\ E [H \ E [2J", 7); // здесь мы используем escape-последовательности ANSI. ^ ~~~~ И я включил и проверил пространство имен.
На опубликованный вопрос невозможно ответить, потому что он налагает невозможные ограничения. «Очистка экрана» - это очень разное действие в разных операционных системах, и способ его выполнения зависит от операционной системы является. См. этот часто задаваемый ответ для полного объяснения того, как это сделать на нескольких популярных платформах с «консолями» и платформах с «терминалами». Вы также найдете в том же месте некоторые объяснения типичных ошибок, которых следует избегать, некоторые из которых - увы! - даны выше в качестве ответов.
Не стал бы
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³³³³³³³³³³
Кажется, достаточно для моего монитора шириной 5,874 км.
Это должно работать, если вы работаете на консоли
#include <conio.h>
int main()
{
clrscr();
}
<conio.h> не является частью стандарта C++, он будет работать только в Turbo C++
но не все компиляторы, а всего несколько. Есть ли в LINUX какой-либо conio.h, о чем заботится ОП? stackoverflow.com/questions/8792317/…
и ваш код не может даже скомпилироваться в Windows / MSDOS, прежде чем я его отредактировал
conio.h - очень старая устаревшая библиотека для 16-битных компиляторов, которая в современных системах не рекомендуется.
Короткий ответ
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
}
Вы можете следовать схеме, показанной выше, и изменять два сегмента кода по своему усмотрению.
Консоль даже не существует в стандарте C++ 11, так что ваш вопрос не имеет никакого смысла педантично. А как насчет перенаправления вашей программы
foo(например,foo > output.txt) или конвейерной обработки (например,foo | grep xxx)? Кстати, на некоторых компьютерах нет консолей (например, большинство веб-серверов или VPS)