Как очистить экран консоли в 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 ));

#include <conio.h>

и использовать

clrscr()

обходной путь, проверенный в 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");
    }
}