web-dev-qa-db-fra.com

Comment effacez-vous l'écran de la console en C?

Existe-t-il un moyen "approprié" de vider la fenêtre de la console en C, en plus d'utiliser system("cls")?

43
devurs

Eh bien, C ne comprend pas le concept d'écran. Donc, tout code ne serait pas portable. Peut-être jetez un oeil à conio.h ou curses , selon vos besoins?

La portabilité est un problème, peu importe la bibliothèque utilisée.

25
Tom
printf("\e[1;1H\e[2J");

Cette fonction fonctionnera sur les terminaux ANSI, demande POSIX. Je suppose qu'il existe une version qui pourrait également fonctionner sur la console de Windows, car elle prend également en charge les séquences d'échappement ANSI.

#include <unistd.h>

void clearScreen()
{
  const char *CLEAR_SCREEN_ANSI = "\e[1;1H\e[2J";
  write(STDOUT_FILENO, CLEAR_SCREEN_ANSI, 12);
}

Il existe d'autres alternatives , dont certaines ne déplacent pas le curseur sur {1,1}.

24
Avinash Katiyar

Puisque vous mentionnez cls, vous parlez de windows. Si tel est le cas, alors cet élément de la BC a le code qui le fera. Je viens de l'essayer, et cela a fonctionné quand je l'ai appelé avec le code suivant:

cls( GetStdHandle( STD_OUTPUT_HANDLE ));
10
Mark Wilkins
#include <conio.h>

et utilise 

clrscr()
8
Vivek Sharma

Solution palliative testée sous Windows (cmd.exe), Linux (Bash et zsh) et OS X (zsh):

#include <stdlib.h>

void clrscr()
{
    system("@cls||clear");
}
8
Jamesits

Il n'y a pas de moyen portable de faire cela. Bien que diverses bibliothèques de manipulation de curseur telles que les curses soient relativement portables. conio.h est portable entre OS/2 DOS et Windows, mais pas vers les variantes * nix. 

Toute la notion de "console" est un concept qui sort du cadre de la norme C. 

Si vous recherchez une solution d'API Win32 pure, il n'y a pas d'appel unique dans l'API de console Windows pour le faire. Une solution consiste à FillConsoleOutputCharacter d'un nombre suffisamment grand de caractères. Ou/ WriteConsoleOutput Vous pouvez utiliser GetConsoleScreenBufferInfo pour savoir combien de caractères suffiront.

Vous pouvez également créer un tout nouveau tampon d’écran de la console et le rendre actuel.

5
John Knoeller

En utilisant des macros, vous pouvez vérifier si vous utilisez Windows, Linux, Mac ou Unix et appeler la fonction correspondante en fonction de la plate-forme actuelle. Quelque chose comme suit:

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

    #if defined(_WIN32) || defined(_WIN64)
        system("cls");
    #endif
}
4
nbro

Pour la portabilité, essayez ceci:

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

Ensuite, appelez simplement clrscr(). Sous Windows, il utilisera clrscr() de conio.h, et sous Linux, il utilisera des codes d'échappement ANSI.

Si vous vraiment voulez le faire "correctement", vous pouvez éliminer les intermédiaires (conio, printf, etc.) et le faire uniquement avec les outils système de bas niveau (préparer un vidage de code massif):

#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
4
MD XF

il suffit de taper clrscr (); fonction dans void main (). 

à titre d'exemple:

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

clrscr();

fonction facile à effacer l'écran.

1
Firdoon

Pour ce faire, utilisez les fonctions tput ou terminfo pour obtenir les propriétés du terminal, puis insérez des nouvelles lignes en fonction des dimensions.

0
Jack