web-dev-qa-db-ja.com

Cのコンソール画面をどのようにクリアしますか?

system("cls")を使用する以外に、Cのコンソールウィンドウをクリアする「適切な」方法はありますか?

49
devurs

まあ、Cは画面の概念を理解していません。そのため、コードは移植できません。おそらく conio.h または curses をご覧ください。

使用するライブラリに関係なく、移植性が問題になります。

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

この関数はANSI端末で動作し、POSIXを要求します。 ANSIエスケープシーケンスもサポートしているため、ウィンドウのコンソールでも動作するバージョンがあると思います。

#include <unistd.h>

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

他にも alternatives があり、そのうちのいくつかはカーソルを{1,1}に移動しません。

25
Avinash Katiyar

Windows(cmd.exe)、Linux(Bashおよびzsh)およびOS X(zsh)でテストされた回避策:

#include <stdlib.h>

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

マクロを使用すると、Windows、Linux、Mac、またはUnixを使用しているかどうかを確認し、現在のプラットフォームに応じてそれぞれの関数を呼び出すことができます。次のようなもの:

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

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

clsに言及しているため、ウィンドウを参照しているようです。その場合、- このKB項目 にそれを実行するコードがあります。私はそれを試しましたが、次のコードで呼び出したときに機能しました:

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

そして使用

clrscr()
8
Vivek Sharma

移植性のために、これを試してください:

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

次に、clrscr()を呼び出します。 Windowsではconio.hclrscr()を使用し、LinuxではANSIエスケープコードを使用します。

本当に「適切に」実行したい場合は、仲介者(conioprintfなど)を削除し、低レベルのシステムツールだけで実行できます。 (大規模なコードダンプの準備):

#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

これを行うC移植可能な方法はありません。 cursesのようなさまざまなカーソル操作ライブラリは比較的移植性がありますが。 conio.h はOS/2 DOSとWindowsの間で移植可能ですが、* nixバリアントには移植できません。

「コンソール」の概念全体は、標準Cの範囲外の概念です。

純粋なWin32 APIソリューションを探している場合、WindowsコンソールAPIでこれを行うための単一の呼び出しはありません。 1つの方法は、十分な数の文字の FillConsoleOutputCharacter です。または WriteConsoleOutputGetConsoleScreenBufferInfo を使用して、十分な文字数を調べることができます。

また、まったく新しいコンソール画面バッファーを作成して、現在のものにすることもできます。

5
John Knoeller

Windows:

system("cls");

Unix:

system("clear");

代わりに、すべてがスクロールされるまで改行文字を挿入し、 here を見てください。

これにより、移植性を簡単に実現できます。

2
gfe

clrscr()と入力するだけです。 void main()の関数。

例として:

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

clrscr();

画面をクリアしやすい機能。

1
Fridoon

適切な方法は、tputまたはterminfo関数を使用して端末プロパティを取得し、次元に応じて改行を挿入することです。

0
Jack