web-dev-qa-db-ja.com

C ++を使用してWindowsとLinuxの両方でコンソールをクリアする方法

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

26
yxk

短い答え:できません。

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

最も難しい答え:#ifdef _WIN32などのコードを使用して、オペレーティングシステムによってコードの動作を変えることができます。

28
coppro

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

#include <cstdlib>

void clear_screen()
{
#ifdef WINDOWS
    std::system("cls");
#else
    // Assume POSIX
    std::system ("clear");
#endif
}
53
fmsf

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

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

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

13
Nicola Bonelli

簡単なトリック:コンソールをクリアするために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);
//....
10
Nick

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

4
JdeBP

これは他のプラットフォームでの方法ですが、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
}
3
Adam Pierce

短い答え

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

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

system( "pause")clarification

3
Dr Beco

これは私の質問への回答ではないことはわかっていますが、これは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);
}
2
yxk

このコードは、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__ */
1
iBug

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

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

このループを実行した後、ターミナルでは、一番上にいた場所にスクロールして戻ることができなくなります。これは、常識に基づく非専門的なアプローチです。それはあなたが求めているものに直接答えることはしませんが、うまくいくことができます。

1
Questionare232