wake-up-neo.com

Wie löscht man den Konsolenbildschirm in C?

Gibt es eine "richtige" Möglichkeit, das Konsolenfenster in C zu löschen, außer system("cls")?

43
devurs

Nun, C versteht das Konzept des Bildschirms nicht. Daher wäre jeder Code nicht portierbar. Vielleicht schauen Sie nach conio.h oder Curses , je nach Ihren Bedürfnissen?

Portabilität ist ein Problem, egal welche Bibliothek verwendet wird.

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

Diese Funktion funktioniert auf ANSI-Terminals, fordert POSIX. Ich gehe davon aus, dass es eine Version gibt, die möglicherweise auch auf der Windows-Konsole funktioniert, da sie auch ANSI-Escape-Sequenzen unterstützt.

#include <unistd.h>

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

Es gibt noch einige andere Alternativen , von denen einige den Cursor nicht auf {1,1} bewegen.

24
Avinash Katiyar

Da Sie cls erwähnen, klingt das so, als würden Sie sich auf Fenster beziehen. Wenn ja, dann hat dieses KB-Element den Code, der dies tun wird. Ich habe es gerade ausprobiert und es funktionierte, als ich es mit dem folgenden Code anrief:

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

und verwenden 

clrscr()
8
Vivek Sharma

Eine Problemlösung, die unter Windows (cmd.exe), Linux (Bash und zsh) und OS X (zsh) getestet wurde:

#include <stdlib.h>

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

Versuchen Sie dies aus Gründen der Portabilität:

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

Dann rufen Sie einfach clrscr() auf. Unter Windows wird clrscr() von conio.h Verwendet, und unter Linux werden ANSI-Escape-Codes verwendet.

Wenn Sie wirklich es "richtig" machen wollen, können Sie die Mittelsmänner (conio, printf usw.) eliminieren und es nur mit dem niedrigen Level machen System-Tools (bereiten Sie sich auf einen massiven Code-Dump vor):

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

Es gibt keinen tragbaren C-Weg, dies zu tun. Obwohl verschiedene Cursorbearbeitungsbibliotheken wie Flüche relativ portabel sind. conio.h ist zwischen OS/2-DOS und Windows portierbar, jedoch nicht für * nix-Varianten. 

Die gesamte Vorstellung einer "Konsole" ist ein Konzept, das außerhalb des Geltungsbereichs von Standard C liegt. 

Wenn Sie nach einer reinen Win32-API-Lösung suchen, gibt es keinen einzigen Aufruf in der Windows-Konsolen-API, um dies auszuführen. Eine Möglichkeit ist, FillConsoleOutputCharacter mit einer ausreichend großen Anzahl von Zeichen. Oder WriteConsoleOutput Sie können GetConsoleScreenBufferInfo verwenden, um herauszufinden, wie viele Zeichen ausreichen.

Sie können auch einen völlig neuen Konsolenbildpuffer erstellen und den aktuellen erstellen.

5
John Knoeller

Mit Makros können Sie überprüfen, ob Sie Windows, Linux, Mac oder Unix verwenden, und die jeweilige Funktion abhängig von der aktuellen Plattform aufrufen. Etwas wie folgt:

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

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

Windows:

system("cls");

Unix:

system("clear");

Sie können stattdessen Zeilenumbrüche einfügen, bis alles gescrollt ist. Schauen Sie sich das an hier .

Damit erreichen Sie leicht Portabilität.

2
gfe

geben Sie einfach clrscr () ein. Funktion in void main (). 

zum Beispiel:

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

clrscr();

funktion leicht zu löschen Bildschirm.

1
Firdoon

Der richtige Weg, dies zu tun, ist die Verwendung von tput- oder terminfo-Funktionen zum Abrufen von Terminal-Eigenschaften und Einfügen neuer Zeilen nach Maß.

0
Jack