コンソール制御について、より詳しく、実際の出力例などを上げながら、 まとめたページを作りましたので以下も参照ください。

エスケープシーケンス

作成:

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ディフォルトに戻す


2557135 Today: 159 Yesterday: 1164
Twitter
広告