Existe-t-il un moyen "approprié" de vider la fenêtre de la console en C, en plus d'utiliser system("cls")
?
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}.
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 ));
#include <conio.h>
et utilise
clrscr()
Solution palliative testée sous Windows (cmd.exe), Linux (Bash et zsh) et OS X (zsh):
#include <stdlib.h>
void clrscr()
{
system("@cls||clear");
}
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.
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
}
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
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.
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.