103

タイトルの通り。C++ でコンソールをクリアするにはどうすればよいですか?

4

19 に答える 19

75

純粋な C++ の場合

できません。C++ には、コンソールの概念さえありません。

プログラムは、プリンタに出力したり、ファイルに直接出力したり、別のプログラムの入力にリダイレクトされたりする可能性があります。C++ でコンソールをクリアできたとしても、これらのケースはかなり厄介になります。

comp.lang.c++ FAQ の次のエントリを参照してください。

OS固有

プログラムでコンソールをクリアすることが依然として理にかなっており、オペレーティング システム固有のソリューションに関心がある場合は、それらが存在します。

Windows の場合 (タグのように)、次のリンクを確認してください。

編集:system("cls");Microsoftがそうするように言ったので、この回答は以前に使用について言及しました。ただし、コメントで、これを行うのは安全ではないことが指摘されています。この問題のため、Microsoft の記事へのリンクを削除しました。

ライブラリ (ある程度移植可能)

ncurses は、コンソール操作をサポートするライブラリです。

于 2011-06-26T19:47:46.533 に答える
56

Windows の場合、コンソール 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);
}

考えられるすべてのエラーを喜んで無視しますが、これはコンソールのクリアです。system("cls")エラーをうまく処理するのとは異なります。

*nix の場合、通常は ANSI エスケープ コードを使用できるため、次のようになります。

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

これを使用systemするのは醜いです。

于 2011-06-26T23:51:03.950 に答える
8

ウィンドウコンソールに複数の行を出力しても意味がありません.空の行が追加されるだけです. 悲しいことに、方法はWindows固有であり、conio.h(およびclrscr()が存在しない可能性があり、それも標準ヘッダーではない)またはWin APIメソッドのいずれかが含まれます

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

POSIX システムの場合はもっと簡単です。ncurses または端末関数を使用できます。

#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" ) );
  }
于 2016-09-29T06:31:41.380 に答える
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;
}
于 2015-05-09T07:37:39.377 に答える
3

Windows の場合:

#include <cstdlib>

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

Linux/Unix の場合:

#include <cstdlib>

int main() { 
    std::system("clear");
    return 0;
}
于 2015-07-05T15:57:37.470 に答える
2

system("cls")画面をクリアするために使用します。

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
于 2016-06-12T07:38:50.020 に答える
-1

System::Console::Clear(); を使用します。

これにより、バッファがクリア(空)になります

于 2014-11-26T04:05:26.323 に答える
-4

使用: clrscr();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }
于 2015-04-25T20:13:52.520 に答える
-7

最も簡単な方法は、ストリームを複数回フラッシュすることです(理想的には、可能なコンソールよりも大きい)1024 * 1024は、コンソールウィンドウでは不可能なサイズである可能性があります。

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

  return 0;
}

これに関する唯一の問題はソフトウェアカーソルです。プラットフォーム/コンソールに応じて点滅するもの(または点滅しないもの)は、コンソールの上部ではなく、コンソールの端にあります。ただし、これによって問題が発生することはありません。

于 2011-06-27T03:52:38.067 に答える