C++ で記述された Linux と Windows の両方でコンソールをクリアするためのクロス プラットフォーム ソリューションが必要です。これを行う機能はありますか?また、Windows と Linux で明確にするために、エンドユーザー プログラマーがプログラム内のコードを変更する必要がないことにも注意してください (たとえば、2 つの機能から選択する必要がある場合は、決定を下す必要があります)。実行時またはコンパイル時に自律的に)。
13 に答える
両方のプラットフォームでコンソールをクリアする汎用コマンドはありません。
#include <cstdlib>
void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}
簡単な答え: できません。
より長い答え: curses ライブラリ (Unix では ncurses、Windows ではpdcurses ) を使用します。NCurses はパッケージ マネージャーから利用できる必要があり、ncurses と pdcurses はまったく同じインターフェイスを持っています (pdcurses は、コンソール ウィンドウのように動作するコンソールから独立してウィンドウを作成することもできます)。
最も難しい答え:#ifdef _WIN32さまざまなオペレーティング システムでコードが異なる動作をするようにするために、そのようなものを使用します。
Linux では、コンソールをクリアできます。最も良い方法は、次のエスケープ シーケンスを stdout に書き込むことです。
write(1,"\E[H\E[2J",7);
これは、別のプロセスを作成するオーバーヘッドなしで、/usr/bin/clearが行うことです。
簡単なトリック: コンソールをクリアするための system() コマンドの使用と組み合わせてマクロを使用して、OS の種類をチェックしてみませんか? このようにして、適切なコンソール コマンドをパラメータとしてシステム コマンドを実行します。
#ifdef _WIN32
#define CLEAR "cls"
#else //In any other OS
#define CLEAR "clear"
#endif
//And in the point you want to clear the screen:
//....
system(CLEAR);
//....
投稿された質問は、不可能な制限を課しているため、回答できません。「画面のクリア」は、オペレーティングシステムによって大きく異なり、オペレーティングシステムによって異なります。「コンソール」を備えたいくつかの一般的なプラットフォームおよび「ターミナル」を備えたプラットフォームでそれを行う方法の完全な説明については、この頻繁に与えられる回答を参照してください。また、同じ場所に、避けるべき一般的な間違いの説明がいくつかあります。そのうちのいくつかは—悲しいかな!—上記の回答として与えられています。
これは、他のプラットフォームで行う方法ですが、Windows では機能しません。
cout << "\f";
おそらく、条件付きコンパイルを行う必要があります。
void clrscr()
{
#ifdef _WIN32
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    FillConsoleOutputCharacter(hStdOut, ' ',
                               csbi.dwSize.X * csbi.dwSize.Y,
                               coord, &count);
    SetConsoleCursorPosition(hStdOut, coord);
#else
    cout << "\f";
#endif
}
私はこれが私自身の質問に答えていないことを知っていますが! これは Windows ( #include <windows.h>)で機能します。
void clrscr()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdOut, &csbi);
    FillConsoleOutputCharacter(hStdOut, ' ', csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
    SetConsoleCursorPosition(hStdOut, coord);
}
他の人が既に言ったように、Windows と Linux の両方でコンソールをクリアする同一のコードを 1 つ持つ方法はありません。
また、次の使用を強くお勧めしstd::systemます。
- プログラムが攻撃に対して脆弱になります。誰かが自分の悪意のあるプログラムに置き換えたらどうなるclearかcls
- 上記の結果として、ウイルス対策プログラムはstd::system. コードでこれを使用すると、無害であることが意図されている場合でも、結果のバイナリがウイルス陽性である可能性があります。(実際には無害ではないことに注意してください。)
これが私の解決策です:
#ifdef _WIN32
#include <Windows.h>
#endif
void clrscr() {
#ifdef _WIN32
    COORD tl = { 0,0 };
    CONSOLE_SCREEN_BUFFER_INFO s;
    HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleScreenBufferInfo(console, &s);
    DWORD written, cells = s.dwSize.X * s.dwSize.Y;
    FillConsoleOutputCharacter(console, ' ', cells, tl, &written);
    FillConsoleOutputAttribute(console, s.wAttributes, cells, tl, &written);
    SetConsoleCursorPosition(console, tl);
#else
    std::cout << "\033[2J\033[1; 1H";
#endif
}
上記のパターンに従って、2 つのコード セグメントを好きなように変更できます。
画面をクリアするのに非常に近い代替手段があります。新しい行を何度も繰り返す for ループを使用してみてください。例えば:
for (i = 0; i < 100000; i++)
{
  printf ("\n\n\n\n\n");
}
このループを実行した後、端末は、一番上にいた場所にスクロールして戻ることを許可しません。これは、常識に基づいた専門家ではないアプローチです。あなたが求めていることに直接答えることはありませんが、うまくいく可能性があります。
しません
for (int i=0;i<1000;i++){cout<<endl;}
すべての OS で画面をクリアしますか?