28

C++ で記述された Linux と Windows の両方でコンソールをクリアするためのクロス プラットフォーム ソリューションが必要です。これを行う機能はありますか?また、Windows と Linux で明確にするために、エンドユーザー プログラマーがプログラム内のコードを変更する必要がないことにも注意してください (たとえば、2 つの機能から選択する必要がある場合は、決定を下す必要があります)。実行時またはコンパイル時に自律的に)。

4

13 に答える 13

60

両方のプラットフォームでコンソールをクリアする汎用コマンドはありません。

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}
于 2008-10-23T05:29:42.413 に答える
29

簡単な答え: できません。

より長い答え: curses ライブラリ (Unix では ncurses、Windows ではpdcurses ) を使用します。NCurses はパッケージ マネージャーから利用できる必要があり、ncurses と pdcurses はまったく同じインターフェイスを持っています (pdcurses は、コンソール ウィンドウのように動作するコンソールから独立してウィンドウを作成することもできます)。

最も難しい答え:#ifdef _WIN32さまざまなオペレーティング システムでコードが異なる動作をするようにするために、そのようなものを使用します。

于 2008-10-23T05:28:02.793 に答える
13

Linux では、コンソールをクリアできます。最も良い方法は、次のエスケープ シーケンスを stdout に書き込むことです。

write(1,"\E[H\E[2J",7);

これは、別のプロセスを作成するオーバーヘッドなしで、/usr/bin/clearが行うことです。

于 2008-11-04T22:04:33.653 に答える
10

簡単なトリック: コンソールをクリアするための 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);
//....
于 2013-03-18T16:17:38.270 に答える
6

簡潔な答え

void cls(void)
{
    system("cls||clear");
    return;
}

長い答え、読んでください:

システム(「一時停止」)の明確化

于 2015-11-30T05:39:49.260 に答える
4

投稿された質問は、不可能な制限を課しているため、回答できません。「画面のクリア」は、オペレーティングシステムによって大きく異なり、オペレーティングシステムによって異なります。「コンソール」を備えたいくつかの一般的なプラットフォームおよび「ターミナル」を備えたプラットフォームでそれを行う方法の完全な説明については、この頻繁に与えられる回答を参照してください。また、同じ場所に、避けるべき一般的な間違いの説明がいくつかあります。そのうちのいくつかは—悲しいかな!—上記の回答として与えられています。

于 2011-02-22T14:42:13.190 に答える
3

これは、他のプラットフォームで行う方法ですが、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
}
于 2008-10-23T05:29:12.027 に答える
2

私はこれが私自身の質問に答えていないことを知っていますが! これは 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);
}
于 2008-10-23T05:25:24.047 に答える
1

他の人が既に言ったように、Windows と Linux の両方でコンソールをクリアする同一のコードを 1 つ持つ方法はありません。

また、次の使用を強くお勧めしstd::systemます。

  • プログラムが攻撃に対して脆弱になります。誰かが自分の悪意のあるプログラムに置き換えたらどうなるclearcls
  • 上記の結果として、ウイルス対策プログラムは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 つのコード セグメントを好きなように変更できます。

于 2021-03-25T08:02:43.473 に答える
1

画面をクリアするのに非常に近い代替手段があります。新しい行を何度も繰り返す for ループを使用してみてください。例えば:

for (i = 0; i < 100000; i++)
{
  printf ("\n\n\n\n\n");
}

このループを実行した後、端末は、一番上にいた場所にスクロールして戻ることを許可しません。これは、常識に基づいた専門家ではないアプローチです。あなたが求めていることに直接答えることはありませんが、うまくいく可能性があります。

于 2015-02-21T04:11:29.887 に答える
-2

しません

for (int i=0;i<1000;i++){cout<<endl;}

すべての OS で画面をクリアしますか?

于 2011-11-20T14:51:48.003 に答える