web-dev-qa-db-fra.com

Comment effacer la console sous Windows et Linux en utilisant C ++

J'ai besoin d'une solution multiplateforme pour effacer la console sous Linux et Windows écrite en C++. Y a-t-il des fonctions pour ce faire? Notez également que je ne veux pas que le programmeur utilisateur final doive changer le code de mon programme pour qu'il soit clair pour Windows vs Linux (par exemple, s'il doit choisir entre deux fonctions, la décision doit être prise au moment de l'exécution ou au moment de la compilation de manière autonome).

26
yxk

Réponse courte: vous ne pouvez pas.

Réponse plus longue: utilisez une bibliothèque de curses (ncurses sous Unix, pdcurses sous Windows). NCurses doit être disponible via votre gestionnaire de packages, et ncurses et pdcurses ont exactement la même interface (pdcurses peut également créer des fenêtres indépendamment de la console qui se comportent comme des fenêtres de console).

Réponse la plus difficile: utilisez #ifdef _WIN32 et des trucs comme ça pour que votre code agisse différemment sur différents systèmes d'exploitation.

28
coppro

Il n'y a pas de commande générique pour effacer la console sur les deux plates-formes .

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}
53
fmsf

Sous Linux, il est possible d'effacer la console. La meilleure façon est d'écrire la séquence d'échappement suivante sur stdout:

write(1,"\E[H\E[2J",7);

c'est ce que fait / usr/bin/clear, sans la surcharge de création d'un autre processus.

13
Nicola Bonelli

Une astuce simple: pourquoi ne pas vérifier le type de système d'exploitation en utilisant des macros en combinaison avec la commande system () pour effacer la console? De cette façon, vous allez exécuter une commande système avec la commande de console appropriée comme paramètre.

#ifdef _WIN32
#define CLEAR "cls"
#else //In any other OS
#define CLEAR "clear"
#endif

//And in the point you want to clear the screen:
//....
system(CLEAR);
//....
10
Nick

La question telle que publiée est sans réponse, car elle impose des restrictions impossibles. "Effacer l'écran" est une action très différente à travers différents systèmes d'exploitation, et la façon dont on le fait est spécifique au système d'exploitation. Voir cette réponse fréquemment donnée pour une explication complète de la façon de le faire sur plusieurs plates-formes populaires avec "consoles" et plates-formes avec "terminaux". Vous trouverez également au même endroit une explication des erreurs courantes à éviter, dont plusieurs sont - hélas! - donné ci-dessus comme réponses.

4
JdeBP

Voici comment vous le faites sur toute autre plate-forme, mais cela ne fonctionne pas sous Windows:

cout << "\f";

Vous devrez peut-être faire une compilation conditionnelle:

void clrscr()
{
#ifdef _WIN32
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    FillConsoleOutputCharacter(hStdOut, ' ',
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coord, &count);
    SetConsoleCursorPosition(hStdOut, coord);
#else
    cout << "\f";
#endif
}
3
Adam Pierce

Réponse courte

void cls(void)
{
    system("cls||clear");
    return;
}

Réponse longue , veuillez lire:

clarification du système ("pause")

3
Dr Beco

Je sais que cela ne répond pas à ma propre question mais! Cela fonctionne pour Windows (#include <windows.h>):

void clrscr()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);

    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);

    SetConsoleCursorPosition(hStdOut, coord);
}
2
yxk

Ce code efface la console sous Windows et Unix (bien qu'il soit en fait compilé différemment):

// File: clear_screen.h
#ifndef _CLEAR_SCREEN_H
#define _CLEAR_SCREEN_H
void clearScreen(void); /* Clears the screen */
#endif /* _CLEAR_SCREEN_H */
// File: clear_screen.c
#ifdef _WIN32
#include <windows.h>
void clearScreen(void) {
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD topLeft = {0, 0};
    DWORD dwCount, dwSize;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hOutput, &csbi);
    dwSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hOutput, 0x20, dwSize, topLeft, &dwCount);
    FillConsoleOutputAttribute(hOutput, 0x07, dwSize, topLeft, &dwCount);
    SetConsoleCursorPosition(hOutput, topLeft);
}
#endif /* _WIN32 */

#ifdef __unix__
#include <stdio.h>
void clearScreen(void) {
    printf("\x1B[2J");
}
#endif /* __unix__ */
1
iBug

Eh bien, il existe une alternative très proche pour effacer l'écran. Vous pouvez essayer d'utiliser une boucle for qui répète beaucoup de nouvelles lignes. Par exemple:

for (i = 0; i < 100000; i++)
{
  printf ("\n\n\n\n\n");
}

Après avoir fait cette boucle, le terminal ne vous permettra pas de revenir à l'endroit où vous vous trouviez, une approche non professionnelle avec beaucoup de bon sens. Cela ne répond pas directement à ce que vous demandez, mais cela peut fonctionner.

1
Questionare232