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 で画面をクリアしますか?