Comment puis-je effacer la console

92

Comme dans le titre. Comment puis-je effacer la console en C ++?

Thomas B
la source
Sur quel OS? C'est un peu différent sous Linux par rapport à Windows, juste pour un exemple. Si vous le voulez pour Windows, voir: stackoverflow.com/questions/5866529/…
Jerry Coffin
Essayez-vous d'imprimer un groupe de lignes, puis de l'effacer, ou de l'effacer après chaque ligne?
jpm
1
Je souhaite parfois réinitialiser la vue de la console. Je ne veux pas spammer la console avec des millions de nouvelles lignes.
Thomas B
J'ai demandé comment faire cela en C, en utilisant une poignée de fenêtre de console. C'est la réponse que j'ai reçue. J'espère que cela vous aidera dans votre cas.
Agi Hammerthief

Réponses:

71

Pour du C ++ pur

Vous ne pouvez pas. C ++ n'a même pas le concept de console.

Le programme peut être en train d'imprimer sur une imprimante, de sortir directement dans un fichier ou d'être redirigé vers l'entrée d'un autre programme pour tout ce qu'il veut. Même si vous pouviez effacer la console en C ++, cela rendrait ces cas beaucoup plus compliqués.

Voir cette entrée dans la FAQ comp.lang.c ++:

Spécifique au système d'exploitation

S'il est toujours judicieux de vider la console de votre programme et que vous êtes intéressé par des solutions spécifiques au système d'exploitation, celles-ci existent.

Pour Windows (comme dans votre balise), consultez ce lien:

Edit: Cette réponse précédemment mentionnée en utilisant system("cls");, car Microsoft a dit de le faire. Cependant, il a été souligné dans les commentaires que ce n'est pas une chose sûre à faire . J'ai supprimé le lien vers l'article Microsoft à cause de ce problème.

Bibliothèques (quelque peu portables)

ncurses est une bibliothèque qui prend en charge la manipulation de la console:

Merlyn Morgan-Graham
la source
6
@Alf: J'ai copié-collé cela à partir de l'article MS, alors votez contre eux, pas moi;) Je vais le réparer.
Merlyn Morgan-Graham
11
l'origine n'a pas d'importance - le code qui ne se compile même pas (avec g ++) n'est pas bon. Mais depuis que vous l'avez corrigé, j'ai supprimé le vote négatif. :-)
Bravo et hth. - Alf le
1
@YoushaAleayoub a modifié la réponse pour supprimer le lien MS suggérant l'utilisation system, et a ajouté un lien vers votre article expliquant pourquoi.
Merlyn Morgan-Graham
53

Pour Windows, via l'API de la console:

void clear() {
    COORD topLeft  = { 0, 0 };
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO screen;
    DWORD written;

    GetConsoleScreenBufferInfo(console, &screen);
    FillConsoleOutputCharacterA(
        console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    FillConsoleOutputAttribute(
        console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
        screen.dwSize.X * screen.dwSize.Y, topLeft, &written
    );
    SetConsoleCursorPosition(console, topLeft);
}

Il ignore heureusement toutes les erreurs possibles, mais bon, c'est l'effacement de la console. Pas comme system("cls")gère mieux les erreurs.

Pour les * nixes, vous pouvez généralement utiliser des codes d'échappement ANSI, donc ce serait:

void clear() {
    // CSI[2J clears screen, CSI[H moves the cursor to top-left corner
    std::cout << "\x1B[2J\x1B[H";
}

Utiliser systempour cela est juste moche.

Cat Plus Plus
la source
6
"Utiliser le système pour cela est tout simplement moche." - Pourquoi? Sure me semble plus propre :)
Merlyn Morgan-Graham
17
@ MerlynMorgan-Graham: Il engendre un processus shell pour effacer une console friggin '. En quoi est-ce une solution propre? : P C'est comme utiliser echovia system()au lieu d'écrire sur stdout.
Cat Plus Plus
1
Une doublure FTW! ;) Oui, je suis facétieuse. Le fait qu'il génère un processus shell est une bonne information pour votre réponse, cependant. +1 pour la version * nix.
Merlyn Morgan-Graham le
8
L'utilisation system()est une erreur courante. Il en va de même pour votre méthode suggérée pour Unices. C'est ce qu'il faut faire sur les systèmes POSIX. Vous avez bien compris la partie Win32, bien que vous n'ayez pas incorporé la convention "scroll back".
JdeBP
1
Pas besoin d'archives. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS existe.
JdeBP
20

Pour Linux / Unix et peut-être quelques autres mais pas pour Windows avant 10 TH2:

printf("\033c");

réinitialise le terminal.

Pas d'ange
la source
14

Le moyen le plus simple pour moi sans avoir à réinventer la roue.

void Clear()
{
#if defined _WIN32
    system("cls");
#elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
#elif defined (__APPLE__)
    system("clear");
#endif
}
Joma
la source
8

la sortie de plusieurs lignes sur la console de la fenêtre est inutile..il y ajoute simplement des lignes vides. malheureusement, la manière est spécifique à Windows et implique soit conio.h (et clrscr () peut ne pas exister, ce n'est pas non plus un en-tête standard) ou la méthode API Win

#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 );
  }

Pour le système POSIX, c'est beaucoup plus simple, vous pouvez utiliser ncurses ou des fonctions de terminal

#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" ) );
  }
Swift - Tarte du vendredi
la source
5
// #define _WIN32_WINNT 0x0500     // windows >= 2000 
#include <windows.h> 
#include <iostream>

using namespace std; 

void pos(short C, short R)
{
    COORD xy ;
    xy.X = C ;
    xy.Y = R ;
    SetConsoleCursorPosition( 
    GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
    pos(0,0);
    for(int j=0;j<100;j++)
    cout << string(100, ' ');
    pos(0,0);
} 

int main( void )
{
    // write somthing and wait 
    for(int j=0;j<100;j++)
    cout << string(10, 'a');
    cout << "\n\npress any key to cls... ";
    cin.get();

    // clean the screen
    cls();

    return 0;
}
Firefox_
la source
3

Pour effacer l'écran, vous devrez d'abord inclure un module:

#include <stdlib.h>

cela importera les commandes Windows. Ensuite, vous pouvez utiliser la fonction «système» pour exécuter des commandes Batch (qui éditent la console). Sous Windows en C ++, la commande pour effacer l'écran serait:

system("CLS");

Et cela effacerait la console. Le code entier ressemblerait à ceci:

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
system("CLS");
}

Et c'est tout ce dont vous avez besoin! Bonne chance :)

user3179329
la source
3
system ("cls") n'est pas une solution portable à ce problème, mais il fonctionne sur les systèmes Windows.
CMS_95
4
Ce n'est pas un "module". C ++ n'a pas de "modules". De plus, stdlib.hest spécifié par le standard C, et n'a rien à voir avec "l'importation de commandes Windows" ni même avec Windows lui-même. A part ça pinailler, tu vas bien.
Courses de légèreté en orbite
3

Sous Windows:

#include <cstdlib>

int main() { 
    std::system("cls");
    return 0;
}

Sous Linux / Unix:

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}
LoveToCode
la source
2

Utilisez system("cls")pour effacer l'écran:

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
Wesam
la source
2
Déjà mentionné dans la réponse acceptée. Aucune nouvelle information ici.
Dialecticus
Ensuite, débarrassez-vous de cout / wcout et transférez simplement les éléments vers le système ("echo" + votre sortie);
Tanveer Badar
2

C'est difficile à faire sur MAC car il n'a pas accès aux fonctions Windows qui peuvent aider à effacer l'écran. Ma meilleure solution est de boucler et d'ajouter des lignes jusqu'à ce que le terminal soit clair, puis d'exécuter le programme. Cependant, ce n'est pas aussi efficace ou convivial pour la mémoire si vous l'utilisez principalement et souvent.

void clearScreen(){
    int clear = 5;
    do {
        cout << endl;
        clear -= 1;
    } while (clear !=0);
}
Max Goddard
la source
2

Sous Windows, nous avons plusieurs options:

  1. clrscr () (Fichier d'en-tête: conio.h)

  2. system ("cls") (Fichier d'en-tête: stdlib.h)

Sous Linux, utilisez system ("clear") (Header File: stdlib.h)

Anurag Singh
la source
Notez que tout appel à system () peut être un problème de sécurité.
John Doe le
0

Voici un moyen simple de le faire:

#include <iostream>

using namespace std;

int main()
{
    cout.flush(); // Flush the output stream
    system("clear"); // Clear the console with the "system" function
}

la source
-1

Utilisez System :: Console :: Clear ();

Cela effacera (videra) le tampon

user3882139
la source
3
[Erreur] «Système» n'a pas été déclaré.
LoveToCode
6
Ceci est pour c ++ / CLI (aka .NET c ++)
FryGuy
-1
#include <cstdlib>

void cls(){
#if defined(_WIN32) //if windows
    system("cls");

#else
    system("clear");    //if other
#endif  //finish

}

L'appel juste cls () n'importe où

jdb_jdb
la source
Ce n'est pas ce que recherche l'OP. Lisez le commentaire ajouté à la question.
Agi Hammerthief
-2

Vous pouvez utiliser la méthode de la console claire du système d'exploitation via system ("");
pour Windows, ce serait system ("cls"); par exemple
et au lieu de publier trois codes différents pour différents systèmes d'exploitation. il suffit de créer une méthode pour obtenir ce que OS est en cours d'exécution.
vous pouvez le faire en détectant si des variables système uniques existent avec #ifdef
par exemple

enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/};

void getOs(){
    #ifdef _WIN32
        return OPERATINGSYSTEM.windows
    #elif __APPLE__ //etc you get the point

    #endif
}

int main(){
    int id = getOs();
    if(id == OPERATINGSYSTEM.windows){
        system("CLS");
    }else if (id == OPERATINGSYSTEM.mac){
        system("CLEAR");
    } //etc you get the point

}
OverloadedCore
la source
-2

edit: question complètement refaite

Testez simplement le système sur lequel ils se trouvent et envoyez une commande système en fonction du système. bien que cela soit défini au moment de la compilation

#ifdef __WIN32
    system("cls");
#else
    system("clear"); // most other systems use this
#endif

C'est une méthode complètement nouvelle!

OverloadedCore
la source
3
Une très très mauvaise façon de le faire. De plus, cela n'efface pas la console, il ajoute uniquement des lignes vides. Ça ne va pas aider.
Vishnu Narang
Pour ajouter l'insulte à la blessure, coutpourrait avoir été redirigé vers un fichier. Ensuite, il n'y a aucun concept de console du tout.
Tanveer Badar
-3

utilisez: clrscr ();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }
vijay
la source
3
"C'était une fonction dans <conio.h>, dans les anciens compilateurs Borland C. Ce n'est pas une fonction standard C ++." stackoverflow.com/a/930141/1058115
cojack
-7

Le moyen le plus simple serait de vider le flux plusieurs fois (idéalement plus grand que n'importe quelle console possible) 1024 * 1024 est probablement une taille qu'aucune fenêtre de console ne pourrait jamais être.

int main(int argc, char *argv)
{
  for(int i = 0; i <1024*1024; i++)
      std::cout << ' ' << std::endl;

  return 0;
}

Le seul problème avec ceci est le curseur logiciel; cette chose clignotante (ou non clignotante) en fonction de la plate-forme / de la console sera à la fin de la console, opposée au dessus de celle-ci. Cependant, cela ne devrait jamais causer de problèmes, espérons-le.

graphitemaster
la source
2
Cette réponse est une erreur courante .
JdeBP