Wie kann ich die Konsole löschen?

90

Wie im Titel. Wie kann ich die Konsole in C ++ löschen?

Thomas B.
quelle
Auf welchem ​​Betriebssystem? Es ist unter Linux ein bisschen anders als unter Windows, nur für ein Beispiel. Wenn Sie es für Windows möchten, sehen Sie: stackoverflow.com/questions/5866529/…
Jerry Coffin
Versuchen Sie, eine Reihe von Zeilen zu drucken und sie dann oder nach jeder Zeile zu löschen?
Jpm
1
Ich möchte manchmal die Konsolenansicht zurücksetzen. Ich möchte keine Spam-Konsole mit Millionen von Zeilenumbrüchen versenden.
Thomas B
Ich fragte, wie das in C mit einem Konsolenfenster-Handle gemacht werden soll. Dies ist die Antwort, die ich erhalten habe. Hoffentlich hilft es bei Ihrem Fall.
Agi Hammerthief

Antworten:

70

Für reines C ++

Das kannst du nicht. C ++ hat nicht einmal das Konzept einer Konsole.

Das Programm kann auf einem Drucker gedruckt, direkt in eine Datei ausgegeben oder für alles, was es interessiert, auf die Eingabe eines anderen Programms umgeleitet werden. Selbst wenn Sie die Konsole in C ++ löschen könnten, würden diese Fälle erheblich unübersichtlicher.

Siehe diesen Eintrag in den comp.lang.c ++ FAQ:

Betriebssystemspezifisch

Wenn es immer noch sinnvoll ist, die Konsole in Ihrem Programm zu löschen, und Sie an betriebssystemspezifischen Lösungen interessiert sind, gibt es diese.

Überprüfen Sie für Windows (wie in Ihrem Tag) diesen Link:

Bearbeiten: Diese Antwort wurde bereits mit verwendet system("cls");, da Microsoft dies angekündigt hat. In den Kommentaren wurde jedoch darauf hingewiesen, dass dies keine sichere Sache ist . Ich habe den Link zum Microsoft-Artikel aufgrund dieses Problems entfernt.

Bibliotheken (etwas tragbar)

ncurses ist eine Bibliothek, die die Manipulation von Konsolen unterstützt:

Merlyn Morgan-Graham
quelle
6
@Alf: Ich habe das aus dem MS-Artikel kopiert, also stimme sie ab, nicht ich;) Ich werde es aber reparieren.
Merlyn Morgan-Graham
10
Der Ursprung spielt keine Rolle - Code, der nicht einmal kompiliert werden kann (mit g ++), ist nicht gut. Aber da du es behoben hast, habe ich die Downvote entfernt. :-)
Prost und hth. - Alf
1
@YoushaAleayoub hat die Antwort bearbeitet, um den zu verwendenden MS-Link zu entfernen system, und Ihrem Artikel einen Link hinzugefügt, der erklärt, warum.
Merlyn Morgan-Graham
52

Für Windows über die Konsolen-API:

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

Es ignoriert glücklich alle möglichen Fehler, aber hey, es ist das Löschen der Konsole. Nicht wie system("cls")behandelt Fehler besser.

Für * nixes können Sie normalerweise ANSI-Escape-Codes verwenden.

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

Die Verwendung systemdafür ist einfach hässlich.

Cat Plus Plus
quelle
5
"Das System dafür zu benutzen ist einfach hässlich." - Warum? Sicher sieht für mich sauberer aus :)
Merlyn Morgan-Graham
15
@ MerlynMorgan-Graham: Es erzeugt einen Shell-Prozess, um eine verdammte Konsole zu löschen. Inwiefern ist das eine saubere Lösung? : P Es ist, als würde man echovia verwenden, system()anstatt in stdout zu schreiben.
Cat Plus Plus
Einzeiler FTW! ;) Ja, ich bin scherzhaft. Die Tatsache, dass es einen Shell-Prozess erzeugt, ist eine gute Information für Ihre Antwort, tho. +1 für die * nix-Version.
Merlyn Morgan-Graham
7
Verwenden system()ist ein häufiger Fehler. Dies ist auch Ihre vorgeschlagene Methode für Unices. Dies sollte man auf POSIX-Systemen tun. Sie haben den Win32-Teil richtig verstanden, obwohl Sie die Konvention "Zurückblättern" nicht übernommen haben.
JdeBP
1
Keine Notwendigkeit für Archive. jdebp.eu./FGA/clearing-the-tui-screen.html#CLS existiert.
JdeBP
19

Für Linux / Unix und vielleicht einige andere, aber nicht für Windows vor 10 TH2:

printf("\033c");

wird das Terminal zurücksetzen.

Kein Engel
quelle
11

Der einfachste Weg für mich, ohne das Rad neu erfinden zu müssen.

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

Das Ausgeben mehrerer Zeilen an die Fensterkonsole ist nutzlos. Es werden nur leere Zeilen hinzugefügt. Leider ist der Weg Windows-spezifisch und beinhaltet entweder conio.h (und clrscr () ist möglicherweise nicht vorhanden, das ist auch kein Standard-Header) oder die Win-API-Methode

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

Für POSIX-Systeme ist es viel einfacher, Sie können ncurses oder Terminalfunktionen verwenden

#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 - Friday Pie
quelle
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;
}
Feuerfuchs_
quelle
3

Um den Bildschirm zu löschen, müssen Sie zuerst ein Modul hinzufügen:

#include <stdlib.h>

Dadurch werden Windows-Befehle importiert. Anschließend können Sie mit der Funktion 'System' Stapelbefehle ausführen (mit denen die Konsole bearbeitet wird). Unter Windows in C ++ lautet der Befehl zum Löschen des Bildschirms:

system("CLS");

Und das würde die Konsole löschen. Der gesamte Code würde folgendermaßen aussehen:

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

using namespace std;

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

Und das ist alles was Sie brauchen! Viel Glück :)

user3179329
quelle
3
system ("cls") ist keine tragbare Lösung für dieses Problem, funktioniert jedoch auf Windows-Systemen.
CMS_95
4
Das ist kein "Modul". C ++ hat keine "Module". Darüber hinaus stdlib.hist dies durch den C-Standard festgelegt und hat weder mit dem "Importieren von Windows-Befehlen" noch mit Windows selbst zu tun. Abgesehen von diesem Trottel geht es dir gut.
Leichtigkeitsrennen im Orbit
3

In Windows:

#include <cstdlib>

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

Unter Linux / Unix:

#include <cstdlib>

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

Verwenden Sie system("cls"), um den Bildschirm zu löschen:

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
Wesam
quelle
2
Bereits in der akzeptierten Antwort erwähnt. Keine neuen Informationen hier.
Dialecticus
Dann werden Sie cout / wcout los und leiten einfach Sachen an das System weiter ("echo" + Ihre Ausgabe);
Tanveer Badar
2

Dies ist unter MAC schwierig, da es keinen Zugriff auf die Windows-Funktionen hat, die zum Löschen des Bildschirms beitragen können. Meine beste Lösung besteht darin, Zeilen zu schleifen und hinzuzufügen, bis das Terminal frei ist, und dann das Programm auszuführen. Dies ist jedoch nicht so effizient oder speicherfreundlich, wenn Sie dies hauptsächlich und häufig verwenden.

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

In Windows haben wir mehrere Optionen:

  1. clrscr () (Header-Datei: conio.h)

  2. system ("cls") (Header-Datei: stdlib.h)

Verwenden Sie unter Linux das System ("clear") (Header-Datei: stdlib.h)

Anurag Singh
quelle
Beachten Sie, dass jeder Aufruf von system () ein Sicherheitsproblem darstellen kann.
John Doe
0

Hier ist eine einfache Möglichkeit, dies zu tun:

#include <iostream>

using namespace std;

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

quelle
-1

Verwenden Sie System :: Console :: Clear ();

Dadurch wird der Puffer gelöscht (geleert)

user3882139
quelle
3
[Fehler] 'System' wurde nicht deklariert.
LoveToCode
6
Dies ist für c ++ / CLI (auch bekannt als .NET c ++)
FryGuy
-1
#include <cstdlib>

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

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

}}

Rufen Sie einfach überall cls () auf

jdb_jdb
quelle
Dies ist nicht das, wonach das OP sucht. Lesen Sie den Kommentar zur Frage.
Agi Hammerthief
-2

Sie können die Clear Console-Methode des Betriebssystems über das System ("") verwenden.
für Windows wäre es System ("cls"); Zum Beispiel
und anstatt drei verschiedene Codes für verschiedene Betriebssysteme freizugeben. Machen Sie einfach eine Methode, um herauszufinden, was os läuft.
Sie können dies tun, indem Sie feststellen, ob mit #ifdef eindeutige Systemvariablen vorhanden sind,
z

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
quelle
-2

Bearbeiten: Frage komplett überarbeitet

Testen Sie einfach, auf welchem ​​System sie sich befinden, und senden Sie je nach System einen Systembefehl. Dies wird jedoch zur Kompilierungszeit festgelegt

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

Dies ist eine völlig neue Methode!

OverloadedCore
quelle
3
Ein sehr sehr schlechter Weg, es zu tun. Außerdem wird die Konsole nicht gelöscht, sondern nur Leerzeilen hinzugefügt. Ich werde nicht helfen.
Vishnu Narang
Um die Verletzung zusätzlich zu beleidigen, wurde sie coutmöglicherweise in eine Datei umgeleitet. Dann gibt es überhaupt kein Konzept für eine Konsole.
Tanveer Badar
-3

benutze: clrscr ();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }
Vijay
quelle
3
"Früher war es eine Funktion in <conio.h>, in alten Borland C-Compilern. Es ist keine C ++ - Standardfunktion." stackoverflow.com/a/930141/1058115
Cojack
-7

Der einfachste Weg wäre, den Stream mehrmals zu leeren (idealerweise größer als jede mögliche Konsole). 1024 * 1024 ist wahrscheinlich eine Größe, die kein Konsolenfenster jemals haben könnte.

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

  return 0;
}

Das einzige Problem dabei ist der Software-Cursor. Das blinkende (oder nicht blinkende) Ding befindet sich je nach Plattform / Konsole am Ende der Konsole und nicht oben. Dies sollte jedoch hoffentlich niemals zu Problemen führen.

Graphitemaster
quelle
2
Diese Antwort ist ein häufiger Fehler .
JdeBP