web-dev-qa-db-ja.com

C ++コードを使用したLinuxの端末のクリア

さて、私はこれを行う方法を研究してきましたが、ターミナルで出力がすべてあるプログラムを実行していますが、プログラムを実行し続けることができるように、プログラム内から画面をクリアするにはどうすればよいですか?

ターミナルでclearと入力するだけで問題は解決しますが、先ほど言ったように、このプログラムの場合は私にとってより有益です。

うまくいくものを見つけましたが、それが何なのか、何をしているのかわかりません。

cout << "\033[2J\033[1;1H";

それは機能しますが、あなたがそれを説明することができれば、それが何であるかについての手掛かりがありません。

32
John

これらはANSIエスケープコードです。最初のもの(\033[2J)は、画面全体(J)を上から下(2)から消去します。 2番目のコード(\033[1;1H)は、カーソルを行1、列1に配置します。

すべてのANSIエスケープはシーケンスで始まります ESC[で区切られたゼロ個以上のパラメーターを持ちます ;、コマンド文字(J そして H あなたの場合)。 \033は、エスケープ文字のCスタイルの8進数シーケンスです。

完全なロードショーについては here をご覧ください。

48
Marcelo Cantos

予期しない状況で壊れる可能性のある特定のエスケープシーケンスに依存する代わりに(必要であればトレードオフは問題ありませんが)、シェルで行うのと同じことを行うことができます。

std::system("clear");

一般的にsystem()は避ける必要がありますが、ユーザー対話型プログラムでは、余分なシェルの解析もプロセスのオーバーヘッドも重要ではありません。この場合、シェルのエスケープにも問題はありません。

System()を回避したい場合は、常にfork/execを使用してclearを呼び出すことができます。 [n] cursesまたは別の端末ライブラリを既に使用している場合は、それを使用します。

10
Roger Pate

移植性のために、termcapのcl(クリア)機能(クリアスクリーンとカーソルホーム)から文字列を取得する必要があります。 (または、Roger Pateの指示に従ってstd :: system( "clear")を使用します)。

man 3 termcap(ncursesで)
man 5 termcap
set | grep TERMCAP

0
kauppi