Как очистить экран консоли в C? - PullRequest
46 голосов
/ 27 февраля 2010

Есть ли "правильный" способ очистить окно консоли в C, кроме использования system("cls")?

Ответы [ 12 ]

25 голосов
/ 05 октября 2011
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}.

24 голосов
/ 27 февраля 2010

Ну, C не понимает концепцию экрана. Таким образом, любой код не сможет быть переносимым. Может быть, посмотрите на conio.h или проклятия , в соответствии с вашими потребностями?

Переносимость - это проблема, независимо от того, какая библиотека используется.

11 голосов
/ 31 октября 2015

Обходной путь, протестированный в Windows (cmd.exe), Linux (Bash и zsh) и OS X (zsh):

#include <stdlib.h>

void clrscr()
{
    system("@cls||clear");
}
10 голосов
/ 27 февраля 2010

Поскольку вы упоминаете cls, звучит так, как будто вы имеете в виду окна. Если это так, то этот элемент базы знаний имеет код, который будет это делать. Я только что попробовал, и это сработало, когда я позвонил со следующим кодом:

cls( GetStdHandle( STD_OUTPUT_HANDLE ));
8 голосов
/ 28 марта 2016

Используя макросы, вы можете проверить, используете ли вы Windows, Linux, Mac или Unix, и вызвать соответствующую функцию в зависимости от текущей платформы. Что-то следующее:

void clear(){
    #if defined(__linux__) || defined(__unix__) || defined(__APPLE__)
        system("clear");
    #endif

    #if defined(_WIN32) || defined(_WIN64)
        system("cls");
    #endif
}
8 голосов
/ 27 февраля 2010
#include <conio.h>

и используйте

clrscr()
6 голосов
/ 28 февраля 2017

Для мобильности попробуйте это:

#ifdef _WIN32
#include <conio.h>
#else
#include <stdio.h>
#define clrscr() printf("\e[1;1H\e[2J")
#endif

Тогда просто позвоните clrscr(). В Windows он будет использовать conio.h clrscr(), а в Linux он будет использовать управляющие коды ANSI.

Если вы действительно хотите сделать это "правильно", вы можете устранить посредников (conio, printf и т. Д.) И сделать это только с помощью низкоуровневых системных инструментов (подготовить для массивного дампа кода):

#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
5 голосов
/ 28 февраля 2010

Нет C-портативного способа сделать это. Хотя различные библиотеки манипулирования курсором, такие как curses, относительно переносимы. conio.h является переносимым между OS / 2 DOS и Windows, но не для * nix вариантов.

Понятие «консоль» в целом является концепцией, выходящей за рамки стандарта C.

Если вы ищете чистое решение Win32 API, в консольном API Windows нет единого вызова для этого. Одним из способов является FillConsoleOutputCharacter из достаточно большого количества символов. Или WriteConsoleOutput Вы можете использовать GetConsoleScreenBufferInfo , чтобы узнать, сколько символов будет достаточно.

Вы также можете создать совершенно новый консольный буфер экрана и сделать текущий.

2 голосов
/ 27 февраля 2010

Windows

system("cls");

Unix:

system("clear");

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

С этим вы легко добьетесь переносимости.

1 голос
/ 18 января 2013

просто введите clrscr (); функция в void main ().

как пример:

void main()
{
clrscr();
printf("Hello m fresher in programming c.");
getch();
}

clrscr();

функция легко очистить экран.

...