Enter キーが押されるのを待たずに、標準入力から文字をキャプチャします。

stdin で接続される可能性のある使用端末に大きく依存するため、純粋な C++ では移植可能な方法では不可能です。 (通常はライン バッファリングされます)。ただし、そのためにライブラリを使用できます:

<オール> <リ>

conio は Windows コンパイラで利用できます。 _getch() を使用 Enterキーを待たずに文字を与える機能。私は頻繁に Windows を開発するわけではありませんが、クラスメートが <conio.h> だけを含むのを見たことがあります。 そしてそれを使用してください。 conio.h を参照 ウィキペディアで。 getch() がリストされています 、これは Visual C++ で非推奨と宣言されています。

<リ>

Linux で使用可能な curses。互換性のある curses の実装は、Windows でも利用できます。 getch() もあります 関数。 (man getch を試してください そのマンページを表示するには)。ウィキペディアの呪いを参照してください。

クロス プラットフォームの互換性を目指す場合は、curses を使用することをお勧めします。そうは言っても、ラインバッファリングをオフにするために使用できる関数があると確信しています(「クックモード」ではなく「生モード」と呼ばれていると思います- man stty を調べてください )。私が間違っていなければ、Curses はそれをポータブルな方法で処理します。


Linux (およびその他の UNIX 系システム) では、次の方法でこれを行うことができます:

#include <unistd.h>
#include <termios.h>

char getch() {
        char buf = 0;
        struct termios old = {0};
        if (tcgetattr(0, &old) < 0)
                perror("tcsetattr()");
        old.c_lflag &= ~ICANON;
        old.c_lflag &= ~ECHO;
        old.c_cc[VMIN] = 1;
        old.c_cc[VTIME] = 0;
        if (tcsetattr(0, TCSANOW, &old) < 0)
                perror("tcsetattr ICANON");
        if (read(0, &buf, 1) < 0)
                perror ("read()");
        old.c_lflag |= ICANON;
        old.c_lflag |= ECHO;
        if (tcsetattr(0, TCSADRAIN, &old) < 0)
                perror ("tcsetattr ~ICANON");
        return (buf);
}

基本的に、canonical モード (およびエコーを抑制するための echo モード) をオフにする必要があります。


同じ問題を解決しようとしているときに、別のフォーラムでこれを見つけました。私が見つけたものから少し修正しました。それはうまくいきます。私は OS X を実行しているので、Microsoft を実行している場合は、正しい system() コマンドを見つけて raw モードとクック モードに切り替える必要があります。

#include <iostream> 
#include <stdio.h>  
using namespace std;  

int main() { 
  // Output prompt 
  cout << "Press any key to continue..." << endl; 

  // Set terminal to raw mode 
  system("stty raw"); 

  // Wait for single character 
  char input = getchar(); 

  // Echo input:
  cout << "--" << input << "--";

  // Reset terminal to normal "cooked" mode 
  system("stty cooked"); 

  // And we're out of here 
  return 0; 
}