• ベストアンサー

コマンドラインに出力した文字を消すには

printf 関数などで出力した文字を行単位などで消したい場合,どのような操作をすればよいでしょうか. visual studio 2005を使っているのですがprintfでエスケープシーケンスを使っても,うまく文字を消すことができなかったです. 分かる方いたら教えてください.

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

エスケープシーケンスが使えないなら、恐らくWindowsのAPIを使わなくてはなりません。 GetConsoleScreenBufferInfoでコンソールのサイズなどを取得し、 ReadConsoleOutputでコンソールの内容を取得し、 不要な行を消去して、 WriteConsoleOutputで書き込めば良いはずです。 詳細はGoogleさんに聞けば、サンプルが見つかると思います。 しかし、printf等は検索結果やエラー情報など、後から消す必要の無いものを表示するためのものだと思います。 sorokukuさんがどのようなプログラムを製作中なのかはわかりませんが、無理に消す方法を探すよりも、普通のWindowsアプリにしてテキストコントロールやラベルで表示したほうが簡単だと思います。Visual C++ Expressでも.NETを使ったアプリなら作れるはずですし、Turbo C++と言う手もあります。

その他の回答 (2)

noname#144013
noname#144013
回答No.3

こんにちは。 > printfでエスケープシーケンスを使っても,うまく文字を消すことができなかったです. とありますが、具体的にどのようなコード(プログラムのソース)を書かれたのでしょうか? 差し支えなければ、その部分(文字列を出力する部分~その文字列を消去する部分)のソース (プログラムが小さければできれば全ソース)を提示して頂けないでしょうか?  その方が、回答者の方も問題を把握でき具体的なアドバイスも貰い易いかと思います。 参考までに、エスケープシーケンスを使用した文字列消去(行単位)のサンプルプログラムを 作ってみましたので、宜しければ試してみて下さい。 お使いの環境で上手くビルド及び実行できるかどうか判りませんが、多少なりともヒントになれ ば幸いに思います。 なお、本サンプルは、当方では「Windows98SE+Visual C++ 5.0」の環境で作成&実行テスト を行なっています。 また、本サンプルで使用しているエスケープ・シーケンスに関して下記サイトを参考にさせて頂きました。 ■参考サイト ANSI.SYS - キーボードと画面の拡張制御のサポート [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンス http://www.fpcu.jp/dosvcmd/ansi.htm ■サンプルプログラム /* * tesc.c : エスケープシーケンスによる1行消去のテストプログラム * *【概要】 * コンソール画面に出力した文字列を行単位に出力した行数分消去を * 行ないます。 *【補足】 * 1)本プログラムは、Windows系OS用のコンソールプログラムです。 * 2)コンソール画面のカーソル制御などのために、ANSIエスケープ・ *   シーケンスを使用しています。 * *<使用しているエスケープ・シーケンス> * ※下記中の"ESC"はエスケープコード(0x1B)を意味します。 * ・ESC[s  :カーソル位置の保存 * ・ESC[u  :カーソル位置の復元 * ・ESC[nnA :カーソルを上にnn行移動(カーソルが最上行の時は無視される) * ・ESC[K  :現在行のカーソル位置以降を消去 */ #include <stdio.h> #include <conio.h> /* define const */ #define ESC "\x1b" //エスケープ文字(ESC:0x1B)の定義 int main(void) { int i, icnt; /* ダミー文字列の表示(1行表示毎に行カウンタを+1する) */ icnt = 0; //行カウンタのリセット printf("01:*** 1行目***\n"); icnt++; printf("02:*** 2行目***\n"); icnt++; printf("03:*** 3行目***\n"); icnt++; printf("04:*** 4行目***\n"); icnt++; printf("05:*** 5行目***\n"); icnt++; /* 表示した文字列の消去(現在行から遡って行カウンタ分の1行消去を行なう) */ _cputs(ESC"[s"); //カーソル位置の保存(現在行でカーソルが左端にあることが前提) for(i=0; i<icnt; i++){ //行カウンタ分ループ _cputs(ESC"[1A"); //カーソルを上に1行移動(カーソルが最上行の時は無視される) _cputs(ESC"[K"); //現在行のカーソル位置以降を消去 } _cputs(ESC"[u"); //カーソル位置の復元 return 0; }

  • DIooggooID
  • ベストアンサー率27% (1730/6405)
回答No.1

> printf 関数などで出力した文字を行単位などで消したい場合,・・・  ご質問の内容は、仮にキーボードから入力している状態を想定した場合に、Back Space キーを押下するようなことでしょうか?

sorokuku
質問者

お礼

はい. そうです,説明が不足して申し訳ありません.

関連するQ&A