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


92

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


どのOSで?一例として、LinuxとWindowsではかなり異なります。Windowsで必要な場合は、stackoverflow.com
Jerry Coffin

たくさんの行を印刷してからクリアしようとしていますか、それとも各行の後にクリアしようとしていますか?
jpm 2011年

1
時々コンソールビューをリセットしたい。何百万もの改行でコンソールをスパムしたくありません。
トーマスB

コンソールウィンドウハンドルを使用して、Cでこれを行う方法を尋ねました。これが私が受け取った答えです。うまくいけば、それはあなたのケースに役立ちます。
Agi Hammerthief 2017

回答:


71

純粋なC ++の場合

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

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

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

OS固有

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

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

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

ライブラリ(ややポータブル)

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


6
@Alf:MSの記事からコピーして貼り付けたので、私ではなく反対票を投じてください;)ただし修正します。
マーリンモーガン-グラハム2011

11
起源は関係ありません-(g ++で)コンパイルすらしないコードは良くありません。しかし、あなたがそれを修正したので、私は反対票を削除しました。:-)
乾杯とhth。-アルフ2011年

1
@YoushaAleayoubは、回答を編集して、使用を提案するMSリンクを削除し、そのsystem理由を説明するリンクを記事に追加しました。
Merlyn Morgan-Graham

52

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するのは醜いです。


6
「これにシステムを使用するのは醜いです。」- なぜ?確かに私にはきれいに見えます:)
Merlyn Morgan-Graham 2011

16
@ MerlynMorgan-Graham:シェルプロセスを生成して、極寒のコンソールをクリアします。それはどのようにクリーンな解決策ですか?:Pstdoutに書き込む代わりにechoviaを使用するようなものsystem()です。
Cat Plus Plus

1
ワンライナーFTW!;)はい、私は面白がっています。それがシェルプロセスを生み出すという事実は、あなたの答えにとって良い情報です。* nixバージョンの場合は+1。
マーリンモーガン-グラハム2011

8
使用system()はよくある間違いです。 それで、Unicesのためにあなたが提案する方法もそうです。 これは、POSIXシステムで行うべきことです。 「スクロールバック」規則を組み込んでいなかったにもかかわらず、Win32の部分は正しく理解できました。
jdeBP 2011年

1
アーカイブは必要ありません。 jdebp.eu./FGA/clearing-the-tui-screen.html#CLSが存在します。
jdeBP 2017年

20

Linux / Unixおよびその他の場合、10 TH2より前のWindowsの場合:

printf("\033c");

ターミナルをリセットします。


14

車輪の再発明をしなくても、私にとって最も簡単な方法です。

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

8

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

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

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

3

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

#include <stdlib.h>

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

system("CLS");

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

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

using namespace std;

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

そして、それはあなたが必要とするすべてです!幸運を :)


3
system( "cls")はこの問題に対する移植可能なソリューションではありませんが、Windowsシステムでは機能します。
CMS_95 2015

4
それは「モジュール」ではありません。C ++には「モジュール」がありません。さらに、stdlib.hC標準で指定されており、「Windowsコマンドのインポート」やWindows自体とは関係ありません。そのつまらないことを除いて、あなたは大丈夫です。
軌道上でのライトネスレース

3

Windowsの場合:

#include <cstdlib>

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

Linux / Unixの場合:

#include <cstdlib>

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

2

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

#include <stdlib.h>

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

2
受け入れられた回答ですでに言及されています。ここに新しい情報はありません。
弁証法2016年

次に、cout / wcoutを取り除き、system( "echo" +出力)にパイプするだけです。
Tanveer Badar 2017

2

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

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

2

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

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

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

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


system()の呼び出しは、セキュリティの問題になる可能性があることに注意してください。
John Doe

0

これを行う簡単な方法は次のとおりです。

#include <iostream>

using namespace std;

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

-1

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

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


3
[エラー] 'システム'が宣言されていません。
loveToCode 2015

6
これはc ++ / CLI(別名.NET c ++)用です
FryGuy 2015年

-1
#include <cstdlib>

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

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

}

どこでもcls()を呼び出すだけです


これはOPが探しているものではありません。質問に追加されたコメントを読んでください。
Agi Hammerthief 2017

-2

system( "");を介してオペレーティングシステムのclearconsoleメソッドを使用できます。
Windowsの場合はsystem( "cls");になります。たとえば
、異なるオペレーティングシステム用に3つの異なるコードをリリースする代わりに。実行中のOSを取得するメソッドを作成するだけです。
独自のシステム変数は、#ifdefので存在する場合は、検出することにより、これを行うことができます
たとえば、

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

}

-2

編集:質問を完全にやり直しました

それらがどのシステム上にあるかをテストし、システムに応じてシステムコマンドを送信するだけです。これはコンパイル時に設定されますが

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

これはまったく新しい方法です!


3
それを行うには非常に悪い方法です。さらに、コンソールをクリアするのではなく、空白行を追加するだけです。助けにはならない。
Vishnu Narang 2016

怪我に侮辱を加えるcoutために、ファイルにリダイレクトされた可能性があります。その場合、コンソールの概念はまったくありません。
Tanveer Badar 2017

-3

使用:clrscr();

#include <iostream>
using namespace std;
int main()
      {           
         clrscr();
         cout << "Hello World!" << endl;
         return 0;
      }

3
「これは、古いBorland Cコンパイラの<conio.h>の関数でした。これは、C ++の標準関数ではありません。」stackoverflow.com/a/930141/1058115
2016年

-7

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

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

  return 0;
}

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


2
この答えはよくある間違いです。
jdeBP 2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.