web-dev-qa-db-ja.com

コンソールをクリアするにはどうすればよいですか

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

78
Thomas B

純粋なC++の場合

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

プログラムは、プリンタへの印刷、ファイルへの直接出力、または他のプログラムの入力にリダイレクトされます。 C++でコンソールをクリアできたとしても、これらのケースはかなり面倒になります。

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

OS固有

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

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

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

ライブラリ(多少移植可能)

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

62

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")がエラーをより良く処理するのではない。

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

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

これにsystemを使用するのはisいだけです。

47
Cat Plus Plus

Linux/Unixおよび他のいくつかの可能性がありますが、10 TH2以前のWindowsではそうではありません。

printf("\033c");

端末をリセットします。

15
NoAngel

ウィンドウコンソールに複数の行を出力することは役に立ちません。空の行を追加するだけです。悲しいことに、方法はウィンドウ固有であり、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" ) );
  }
6
// #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;
}
4
Firefox_

これは本当に途切れ途切れですが、試してください:

void cls() {
    for (int i = 0; i < 250; ++i) {
        std::cout << endl;
    }
}
3
nullptr

system("cls")を使用して画面をクリアします。

#include <stdlib.h>

int main(void)
{
    system("cls");
    return 0;
}
3
Wesam

画面をクリアするには、最初にモジュールを含める必要があります。

#include <stdlib.h>

これにより、Windowsコマンドがインポートされます。次に、「システム」機能を使用して、バッチコマンド(コンソールを編集)を実行できます。 C++のWindowsでは、画面をクリアするコマンドは次のようになります。

system("CLS");

そして、それはコンソールをクリアします。コード全体は次のようになります。

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

using namespace std;

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

そして、それはあなたが必要とするすべてです!がんばろう :)

3
user3179329

Windowsの場合:

#include <cstdlib>

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

Linux/Unixの場合:

#include <cstdlib>

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

これは、画面をクリアするのに役立つウィンドウ機能にアクセスできないため、MAC参照で行うのは困難です。私の最善の解決策は、ターミナルがクリアになるまでループして行を追加し、プログラムを実行することです。ただし、これを主に頻繁に使用する場合、これは効率的でもメモリフレンドリーでもありません。

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

車輪を再発明することなく私にとって最も簡単な方法。

void Clear()
{
#if defined _WIN32
    system("cls");
#Elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
    system("clear");
#Elif defined (__Apple__)
    system("clear");
#endif
}
1
Joma

これを行う簡単な方法を次に示します。

#include <iostream>

using namespace std;

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

Windowsには複数のオプションがあります:

  1. clrscr()(ヘッダーファイル:conio.h)

  2. system( "cls")(ヘッダーファイル:stdlib.h)

Linuxでは、system( "clear")(ヘッダーファイル:stdlib.h)を使用します

0
Anurag Singh