Как очистить экран консоли в C?
есть ли "правильный" способ очистить окно консоли в C, кроме использования system("cls")
?
12 ответов
Ну, C не понимает концепцию экрана. Таким образом, любой код не будет переносимым. Может быть, взгляните на попечительством.h или проклятие, согласно вашим потребностям?
переносимость является проблемой, независимо от того, какая библиотека используется.
printf("\e[1;1H\e[2J");
эта функция будет работать на терминалах ANSI, требует POSIX. Я предполагаю, что есть версия, которая также может работать на консоли окна, так как она также поддерживает escape-последовательности ANSI.
#include <unistd.h>
void clearScreen()
{
const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}
есть некоторые другие варианты, некоторые из которых не перемещают курсор в {1,1}.
Так как вы упомянули cls
, похоже, вы имеете в виду windows. Если так, то этот пункт КБ есть код, который это сделает. Я просто попробовал, и это сработало, когда я вызвал его со следующим кодом:
cls( GetStdHandle( STD_OUTPUT_HANDLE ));
обходной путь, проверенный в Windows (cmd.exe), Linux (Bash и zsh) и OS X (zsh):
#include <stdlib.h>
void clrscr()
{
system("@cls||clear");
}
нет портативного способа сделать это. Хотя различные библиотеки манипуляции курсором, такие как проклятия, относительно переносимы. попечительством.h переносится между OS / 2 DOS и Windows, но не для *Nix вариантов.
все понятие "консоли" является понятием, выходящим за рамки стандарта C.
Если вы ищете чистое решение Win32 API, нет ни одного вызова в API консоли Windows, чтобы сделать это. Один из способов - FillConsoleOutputCharacter достаточно большого количества символов. Или WriteConsoleOutput можно использовать GetConsoleScreenBufferInfo чтобы выяснить, сколько символов будет достаточно.
вы также можете создать совершенно новый буфер экрана консоли и сделать текущей.
используя макросы, вы можете проверить, находитесь ли вы в Windows, Linux, Mac или Unix, и вызвать соответствующую функцию в зависимости от текущей платформы. Что-то вроде:
void clear(){
#if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
system("clear");
#endif
#if defined(_WIN32) || defined(_WIN64)
system("cls");
#endif
}
для переносимости попробуйте следующее:
#ifdef _WIN32
#include <conio.h>
#else
#include <stdio.h>
#define clrscr() printf("\e[1;1H\e[2J")
#endif
тогда просто позвоните clrscr()
. На Windows, он будет использовать conio.h
' s clrscr()
, и в Linux он будет использовать escape-коды ANSI.
если вы действительно хотите делать это "правильно", вы можете устранить посредников (conio
, printf
, etc.) и сделайте это только с помощью низкоуровневых системных инструментов (подготовьтесь к массивному дампу кода):
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#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 );
}
#else // !_WIN32
#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" ) );
}
#endif
окна:
system("cls");
Unix:
system("clear");
вместо этого вы можете вставить символы новой строки, пока все не будет прокручиваться, посмотрите здесь.
С этим, вы достигаете удобоносимости легко.
просто введите clrscr (); функция в void main ().
например:
void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}
clrscr();
функция легко очистить экран.
правильный способ сделать это с помощью tput
или terminfo
функции для получения свойств терминала, а затем вставки новых строк в соответствии с измерениями..
Это должно работать. Затем просто вызовите cls (); всякий раз, когда вы хотите очистить экран.
(используя метод, предложенный раньше.)
#include <stdio.h>
void cls()
{
int x;
for ( x = 0; x < 10; x++ )
{
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
}
}