- ベストアンサー
linux上でgetchを使いたい
linux上でgetch()を使おうと思い、<conio.h>をインクルードしたのですが、未定義のエラーが出てしまいます。どうやら、linuxでは、<conio.h>が無い?みたいなのですが、どうやったら、getch()を使用できるようになるのでしょうか??
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
基本的には #1 さんの参考 URL の方法でいいですが, mygetch() を呼ぶたびに tcgetattr(),tcsetattr() するのでちょっと無駄が多い. (性能低下を招くほどではありませんが.) アプリケーションの起動から終了まで,あるいは一定期間 raw モードだけを 使うのなら,次のサンプルのように一度端末モード設定をしてあとは普通に getchar() を使う方が効率は (少しですが) いいです. /*-------------------------------------------------------------------------- サンプル ・1文字入力するたびに標準出力に出力する. ・制御文字は16進で出力. ・CTRL-D を押すと終了. --------------------------------------------------------------------------*/ #include <stdio.h> #include <unistd.h> #include <termios.h> #define QUIT_CHAR 0x04 /* CTRL-D を押すと終了する.*/ // 端末設定保存用大域変数 struct termios CookedTermIos; // cooked モード用 struct termios RawTermIos; // raw モード用 int main(void) { int c; // 初期状態の端末設定 (cooked モード) を取得・保存する. tcgetattr(STDIN_FILENO, &CookedTermIos); // raw モードの端末設定を作成・保存する. RawTermIos = CookedTermIos; cfmakeraw(&RawTermIos); // 端末を raw モードに設定する. tcsetattr(STDIN_FILENO, 0, &RawTermIos); // 1文字入力されるごとに標準出力にエコーする. while((c = getchar()) != QUIT_CHAR) { if(isprint(c)) { // 印字可能文字の場合:そのまま表示. putchar(c); } else { // 制御文字の場合:16進で出力. printf("<%02X>", c); if(c == '\n') fputs("\r\n", stdout); } } // 端末設定を元に戻す. tcsetattr(STDIN_FILENO, 0, &CookedTermIos); putchar('\n'); return 0; }