- ベストアンサー
エスケープ・シーケンスによる画面消去
次のプログラムを使ってコマンドの画面消去をしようとしたのですが、上手くいきませんでした。どうすれば良いですか? /* sample.c */ #include <stdio.h> int main(){ printf("\x1b[2J"); return(0); } 実行結果 >sample ←[2J
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
★『gcc』には詳しくないので参考までに。 ・『gcc』で Windows のコンソール・アプリケーション(CUI)で作成していますか? WinMain 関数のエラーが出るということは、GUI で作成しているのかな。→CUIに変更してみる。 『gcc』でもWindows のコマンド・プロンプトから実行できるコンソール・アプリケーションが 作成できると思いますので、その設定にして下さい。もしも、GUI で作成する場合は、main の 関数ではなく、WinMain 関数に記述します。 ・また、前回紹介した関数は Win32 API ですので、API 関数を利用できる環境(SDK)などが インストールされている必要があります。 ・とりあえず、下のサンプルがコンパイルできますか試して下さい。→CUI に変更した後に。 サンプル: #include <stdio.h> #include <windows.h> #define SPC (0x20) #define ATR (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE) // 画面消去(ESC [2J)と等価 void cls( void ) { CONSOLE_SCREEN_BUFFER_INFO csbi; COORD coord; HANDLE hOut; DWORD dwWrite; hOut = GetStdHandle( STD_OUTPUT_HANDLE ); GetConsoleScreenBufferInfo( hOut, &csbi ); dwWrite = (csbi.dwSize.X * csbi.dwSize.Y); coord.X = 0; coord.Y = 0; SetConsoleCursorPosition( hOut, coord ); SetConsoleTextAttribute( hOut, ATR ); FillConsoleOutputCharacter( hOut, SPC, dwWrite, coord, NULL ); FillConsoleOutputAttribute( hOut, ATR, dwWrite, coord, NULL ); } int main( void ) { printf( "画面を消去します - Pause -" ); getchar(); cls(); return( 0 ); } 最後に: ・main 関数を利用したい場合は、Windows のコンソール・アプリケーション(CUI)で 作成して下さい。プログラムを CUI に変更すれば、回答者 No.2 さんのアドバイス でも上手くエスケープシーケンスが利用できると思います。 ・『This Program cannot be run in DOS mode.』というエラーはこのプログラムは DOS モードで実行できません。という意味です。→Windows の GUI 用に作られた 場合は実行できないのです。 ・DOS プロンプトでも実行可能なコンソール・アプリケーション(CUI)に変更して下さい。 ・以上。参考に!→『gcc』は詳しくないため設定方法が分かりません。頑張って下さい。
その他の回答 (3)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★ヒント ・MS-DOS の OS ではエスケープシーケンスは利用できますが、Windows のコンソールでは 利用できません。DOS/V機(今のWindowsパソコン)では、エスケープシーケンスを利用するための デバイスドライバなどを組み込めば利用できる。という事を昔、聞いた事があります。 最近ではコンソール・アプリケーションを作成していませんし、エスケープシーケンスも使おうとも 思わないせいか詳細な方法は分かりません。その代わりに下の関数で消去可能です。 ・『FillConsoleOutputCharacter()』関数で指定座標から指定文字数だけ書き込む(消去)が可能です。 MS-DOS の OS ではないため、エスケープシーケンス全部が上手く利用できません。 ・回答者 No.2 さんの情報と次のリンクを参考にして下さい。 リンク: ・http://www.kumei.ne.jp/c_lang/intro/no_61.htm→『第61章 コンソールアプリで画面消去』 ・http://www.kumei.ne.jp/c_lang/intro/no_58.htm→『第58章 コンソールアプリで文字色を変える』 ・http://www.kumei.ne.jp/c_lang/intro/no_59.htm→『第59章 コンソールアプリで簡易時計を作る』 関連関数: ・GetStdHandle() // スクリーンバッファの取得 ・SetConsoleTextAttribute() // テキスト色を設定 ・SetConsoleCursorPosition() // カーソル位置を設定 ・FillConsoleOutputCharacter() // 指定座標から指定文字数だけ書き込む ・FillConsoleOutputAttribute() // 色と背景色 その他: ・面倒ですが上記の関数などでエスケープシーケンスと同じ動作を行えます。 なお、#include <windows.h> をヘッダ部に記述しないと利用できませんので注意! ・以上。参考に!
補足
ありがとうございます。 試してみましたが、今度は winmingw-32.a(main.o): undefined reference to "WinMain@16" というエラーが出てしまいました。 windows.hのバグなんでしょうか?
- deadline
- ベストアンサー率63% (1239/1943)
Windows 2000/XPの『コマンドプロンプト』でご質問のプログラムを実行しても、画面は消去されませんョ。 『コマンドプロンプト』では、ANSIエスケープ・シーケンスはサポートされていないのです。 2000/XPで、ANSIエスケープ・シーケンスを利用したい場合には、"%SystemRoot%\system32\config.nt"ファイルに、 device=%SystemRoot%\system32\ansi.sys を追加後、"cmd.exe"ではなく"command.com"を起動します。 『Microsoft Support Online:How to Enable ANSI.SYS in a Command Window』 http://support.microsoft.com/kb/101875/en-us/ 『答えてねっと:command.comでエスケープシーケンスを使う方法。』 http://www.kotaete-net.net/Default.aspx?pgid=14&qid=240679658410
補足
ありがとうございます。 deadlineさんのおっしゃった通りにやってみたのですが、今度は This Program cannot be run in DOS mode. と表示されて実行できませんでした。 どうすれば良いんでしょうか??
- tatsu99
- ベストアンサー率52% (391/751)
OSはなんでしょうか。 又、コンパイラはなにを使用してますか。
補足
OSはWindows XPです。 コンパイラはgcc-2.95を使用しています。
お礼
本当にありがとうございます。 動きました!画面消去できました!!!