タイトルのように。C ++でコンソールをクリアするにはどうすればよいですか?
タイトルのように。C ++でコンソールをクリアするにはどうすればよいですか?
回答:
純粋なC ++の場合
できません。C ++にはコンソールの概念すらありません。
プログラムは、プリンターに印刷したり、ファイルに直接出力したり、別のプログラムの入力にリダイレクトしたりすることができます。C ++でコンソールをクリアできたとしても、それらのケースはかなり厄介になります。
comp.lang.c ++ FAQのこのエントリを参照してください。
OS固有
それでもプログラムのコンソールをクリアすることが理にかなっていて、オペレーティングシステム固有のソリューションに興味がある場合は、それらが存在します。
Windowsの場合(タグ内)、次のリンクを確認してください。
編集:system("cls");
マイクロソフトがそうするように言ったので、この答えは以前に使用して言及しました。しかし、これは安全なことではないことがコメントで指摘されています。この問題のため、Microsoftの記事へのリンクを削除しました。
ライブラリ(ややポータブル)
ncursesは、コンソール操作をサポートするライブラリです。
system
理由を説明するリンクを記事に追加しました。
Windowsの場合、コンソールAPIを介して:
void clear() {
COORD topLeft = { 0, 0 };
HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO screen;
DWORD written;
GetConsoleScreenBufferInfo(console, &screen);
FillConsoleOutputCharacterA(
console, ' ', screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
FillConsoleOutputAttribute(
console, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_BLUE,
screen.dwSize.X * screen.dwSize.Y, topLeft, &written
);
SetConsoleCursorPosition(console, topLeft);
}
考えられるすべてのエラーを喜んで無視しますが、コンソールのクリアです。system("cls")
エラーをうまく処理するのは好きではありません。
* nixesの場合、通常はANSIエスケープコードを使用できるため、次のようになります。
void clear() {
// CSI[2J clears screen, CSI[H moves the cursor to top-left corner
std::cout << "\x1B[2J\x1B[H";
}
これに使用system
するのは醜いです。
echo
viaを使用するようなものsystem()
です。
system()
はよくある間違いです。 それで、Unicesのためにあなたが提案する方法もそうです。 これは、POSIXシステムで行うべきことです。 「スクロールバック」規則を組み込んでいなかったにもかかわらず、Win32の部分は正しく理解できました。
ウィンドウコンソールに複数行を出力しても意味がありません。空の行を追加するだけです。悲しいことに、方法はWindows固有であり、conio.h(およびclrscr()が存在しない可能性があり、これも標準ヘッダーではありません)またはWinAPIメソッドのいずれかが含まれます
#include <windows.h>
void ClearScreen()
{
HANDLE hStdOut;
CONSOLE_SCREEN_BUFFER_INFO csbi;
DWORD count;
DWORD cellCount;
COORD homeCoords = { 0, 0 };
hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
if (hStdOut == INVALID_HANDLE_VALUE) return;
/* Get the number of cells in the current buffer */
if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
cellCount = csbi.dwSize.X *csbi.dwSize.Y;
/* Fill the entire buffer with spaces */
if (!FillConsoleOutputCharacter(
hStdOut,
(TCHAR) ' ',
cellCount,
homeCoords,
&count
)) return;
/* Fill the entire buffer with the current colors and attributes */
if (!FillConsoleOutputAttribute(
hStdOut,
csbi.wAttributes,
cellCount,
homeCoords,
&count
)) return;
/* Move the cursor home */
SetConsoleCursorPosition( hStdOut, homeCoords );
}
POSIXシステムの場合は、はるかに簡単です。ncursesまたはターミナル関数を使用できます。
#include <unistd.h>
#include <term.h>
void ClearScreen()
{
if (!cur_term)
{
int result;
setupterm( NULL, STDOUT_FILENO, &result );
if (result <= 0) return;
}
putp( tigetstr( "clear" ) );
}
// #define _WIN32_WINNT 0x0500 // windows >= 2000
#include <windows.h>
#include <iostream>
using namespace std;
void pos(short C, short R)
{
COORD xy ;
xy.X = C ;
xy.Y = R ;
SetConsoleCursorPosition(
GetStdHandle(STD_OUTPUT_HANDLE), xy);
}
void cls( )
{
pos(0,0);
for(int j=0;j<100;j++)
cout << string(100, ' ');
pos(0,0);
}
int main( void )
{
// write somthing and wait
for(int j=0;j<100;j++)
cout << string(10, 'a');
cout << "\n\npress any key to cls... ";
cin.get();
// clean the screen
cls();
return 0;
}
画面をクリアするには、最初にモジュールを含める必要があります。
#include <stdlib.h>
これにより、Windowsコマンドがインポートされます。次に、「system」関数を使用して、(コンソールを編集する)バッチコマンドを実行できます。C ++のWindowsでは、画面をクリアするコマンドは次のようになります。
system("CLS");
そして、それはコンソールをクリアします。コード全体は次のようになります。
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
system("CLS");
}
そして、それはあなたが必要とするすべてです!幸運を :)
stdlib.h
C標準で指定されており、「Windowsコマンドのインポート」やWindows自体とは関係ありません。そのつまらないことを除いて、あなたは大丈夫です。
Windowsの場合:
#include <cstdlib>
int main() {
std::system("cls");
return 0;
}
Linux / Unixの場合:
#include <cstdlib>
int main() {
std::system("clear");
return 0;
}
system("cls")
画面をクリアするために使用します。
#include <stdlib.h>
int main(void)
{
system("cls");
return 0;
}
これを行う簡単な方法は次のとおりです。
#include <iostream>
using namespace std;
int main()
{
cout.flush(); // Flush the output stream
system("clear"); // Clear the console with the "system" function
}
System :: Console :: Clear();を使用します。
これにより、バッファがクリア(空)になります
#include <cstdlib>
void cls(){
#if defined(_WIN32) //if windows
system("cls");
#else
system("clear"); //if other
#endif //finish
}
どこでもcls()を呼び出すだけです
system( "");を介してオペレーティングシステムのclearconsoleメソッドを使用できます。
Windowsの場合はsystem( "cls");になります。たとえば
、異なるオペレーティングシステム用に3つの異なるコードをリリースする代わりに。実行中のOSを取得するメソッドを作成するだけです。
独自のシステム変数は、#ifdefので存在する場合は、検出することにより、これを行うことができます
たとえば、
enum OPERATINGSYSTEM = {windows = 0, mac = 1, linux = 2 /*etc you get the point*/};
void getOs(){
#ifdef _WIN32
return OPERATINGSYSTEM.windows
#elif __APPLE__ //etc you get the point
#endif
}
int main(){
int id = getOs();
if(id == OPERATINGSYSTEM.windows){
system("CLS");
}else if (id == OPERATINGSYSTEM.mac){
system("CLEAR");
} //etc you get the point
}
編集:質問を完全にやり直しました
それらがどのシステム上にあるかをテストし、システムに応じてシステムコマンドを送信するだけです。これはコンパイル時に設定されますが
#ifdef __WIN32
system("cls");
#else
system("clear"); // most other systems use this
#endif
これはまったく新しい方法です!
cout
ために、ファイルにリダイレクトされた可能性があります。その場合、コンソールの概念はまったくありません。
使用:clrscr();
#include <iostream>
using namespace std;
int main()
{
clrscr();
cout << "Hello World!" << endl;
return 0;
}
最も簡単な方法は、ストリームを複数回フラッシュすることです(理想的には、可能なコンソールよりも大きい)1024 * 1024は、コンソールウィンドウでは不可能なサイズである可能性があります。
int main(int argc, char *argv)
{
for(int i = 0; i <1024*1024; i++)
std::cout << ' ' << std::endl;
return 0;
}
これに関する唯一の問題はソフトウェアカーソルです。プラットフォーム/コンソールに応じて点滅するもの(または点滅しないもの)は、コンソールの上部ではなく、コンソールの端にあります。ただし、これによって問題が発生することはありません。