C++で記述されたLinuxとWindowsの両方でコンソールをクリアするためのクロスプラットフォームソリューションが必要です。これを行うことで何か機能はありますか?また、エンドユーザーのプログラマーがプログラムのコードを変更してWindowsとLinuxのコードを明確にする必要がないようにしたい(たとえば、2つの関数を選択する必要がある場合は、決定を行う必要がある)実行時またはコンパイル時に自律的に)。
短い答え:できません。
より長い答え:cursesライブラリーを使用してください(UNIXではncurses、Windowsでは pdcurses )。 NCursesはパッケージマネージャーを介して使用できる必要があり、ncursesとpdcursesのインターフェイスはまったく同じです(pdcursesは、コンソールウィンドウのように動作するコンソールとは別にウィンドウを作成することもできます)。
最も難しい答え:#ifdef _WIN32
などのコードを使用して、オペレーティングシステムによってコードの動作を変えることができます。
両方のプラットフォームでコンソールをクリアする の一般的なコマンドはありません。
#include <cstdlib>
void clear_screen()
{
#ifdef WINDOWS
std::system("cls");
#else
// Assume POSIX
std::system ("clear");
#endif
}
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とUnixの両方でコンソールをクリアします(実際にはコンパイル方法は異なります)。
// File: clear_screen.h
#ifndef _CLEAR_SCREEN_H
#define _CLEAR_SCREEN_H
void clearScreen(void); /* Clears the screen */
#endif /* _CLEAR_SCREEN_H */
// File: clear_screen.c
#ifdef _WIN32
#include <windows.h>
void clearScreen(void) {
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
COORD topLeft = {0, 0};
DWORD dwCount, dwSize;
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hOutput, &csbi);
dwSize = csbi.dwSize.X * csbi.dwSize.Y;
FillConsoleOutputCharacter(hOutput, 0x20, dwSize, topLeft, &dwCount);
FillConsoleOutputAttribute(hOutput, 0x07, dwSize, topLeft, &dwCount);
SetConsoleCursorPosition(hOutput, topLeft);
}
#endif /* _WIN32 */
#ifdef __unix__
#include <stdio.h>
void clearScreen(void) {
printf("\x1B[2J");
}
#endif /* __unix__ */
画面をクリアするのに非常に近い方法があります。新しい行を何度も繰り返すforループを使用してみてください。例えば:
for (i = 0; i < 100000; i++)
{
printf ("\n\n\n\n\n");
}
このループを実行した後、ターミナルでは、一番上にいた場所にスクロールして戻ることができなくなります。これは、常識に基づく非専門的なアプローチです。それはあなたが求めているものに直接答えることはしませんが、うまくいくことができます。