コンソール制御について、より詳しく、実際の出力例などを上げながら、 まとめたページを作りましたので以下も参照ください。
エスケープシーケンス
CUI のコマンドラインで動くプログラムを書く上でカーソルの位置などをコントロールできたらと思うことがあります。
こいつを実現するには、「エスケープシーケンス」というものを使います。
しかし、このエスケープシーケンスはハードウェアやOSに依存した部分が多いので注意が必要です。
とりあえず、 Windows 2000/XP (おそらく NT も)のコマンドプロンプトでは機能しない
※ことを確認しました。(ただし、 Cygwin 上では使用可能でした)
MS-DOS プロンプトでは一部動くことを確認しました(一部が動いたのではなく、一部確認したのです)。
ここでは、 VineLinux 2.1 の kterm 上での動作が確認されたものを紹介します。
(実験の結果少なくとも kterm 上ではエスケープシーケンスを使うと日本語表示ができなくなるようでした。)
エスケープシーケンスの書式は
ESC [ n1 ; n2 ... X エスケープコード ANSI識別文字 引数1 引数区切り 引数2 シーケンス識別文字
という形をしています。 エスケープコードの出力の仕方は、エスケープコードの16進数表現は 1b なので printf 文の中の文字列で \x1b と書きます。 \x はあとに続く2つの文字で16進表現される文字コードを出力するエスケープ表現です。実際は
printf("\x1b[2J");
のように書きます。16進表現ではなく8進数で文字を表現する方法を使って \033 と書いてもかまいません。 (シェルプロンプトの設定などでは16進表現は使えなかったが、8進表現を使うと成功した)
※掲示板に書き込みをしてくれている Ray さんからの情報では、
コンソールアプリケーションを作成しコンソール API を使えば、カーソルの制御などが可能になるそうです。
しかし、これは見た目は純粋なC言語で書かれたアプリのようですが、
API をつかってるのでソースコードのレベルで完全に OS に依存しています。
コンパイルにも Visual C++ などが必要で、コンパイルされた実行ファイルは 32bit アプリケーションになり DOS では動きません。
windows.h をインクルードしないと使えないので、ここでやってる内容からは少し外れてしまいます。
機会があれば、番外編などで自分なりにまとめてみたいと思ってます。
参考までに Ray さんから教えていただいた解説サイトを示しておきます。
http://www.kumei.ne.jp/c_lang/
コード | カーソル関連の処理 |
---|---|
ESC[2J | 画面クリア |
ESC[K | カーソル位置から行末までをクリア |
ESC[nA | カーソルを上にn個移動 (nAのnには数字が入る) |
ESC[nB | カーソルを下にn個移動 (nBのnには数字が入る) |
ESC[nC | カーソルを右にn個移動 (nCのnには数字が入る) |
ESC[nD | カーソルを左にn個移動 (nDのnには数字が入る) |
ESC[r;cH | カーソルを絶対位置で(r,c)に移動 (r;cHのr,cには数字が入る) |
コード | 出力文字の属性の指定 |
---|---|
ESC[0m | 属性無指定 (指定された属性のクリア) |
ESC[1m | 高輝度 (実際にはBold指定したように文字が太くなった) |
ESC[4m | 下線をつける。 |
ESC[7m | 反転 (背景色と前景色を入れ替える) |
コード | 前景色の指定 |
---|---|
ESC[30m | 黒 |
ESC[31m | 赤 |
ESC[32m | 緑 |
ESC[33m | 黄色 |
ESC[34m | 青 |
ESC[35m | マゼンダ |
ESC[36m | シアン |
ESC[37m | 白 |
ESC[39m | ディフォルトに戻す |
コード | 背景色の指定 |
---|---|
ESC[40m | 黒 |
ESC[41m | 赤 |
ESC[42m | 緑 |
ESC[43m | 黄色 |
ESC[44m | 青 |
ESC[45m | マゼンダ |
ESC[46m | シアン |
ESC[47m | 灰 |
ESC[49m | ディフォルトに戻す |