デフォルトでは、コンソールはクック モード(標準モード、ライン モードなど) です。これの意味は
- コンソール ドライバがデータをアプリケーションに渡す前にバッファリングしていること
- 文字は、コンソール ドライバーによって自動的にコンソールにエコー バックされます。
通常、これは、行が終了した後、つまりエンターが押されたときにのみ、プログラムが入力を取得することを意味します。自動エコーのため、それらのキャラクターはすでに画面に表示されています。
両方の設定は個別に変更できますが、メカニズムは -- 残念ながら -- OS 固有の呼び出しです。
ウィンドウの場合SetConsoleMode()
:
HANDLE h_stdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
// get chars immediately
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_LINE_INPUT));
// display input echo, set after 12th char.
GetConsoleMode(hStdin, &mode);
SetConsoleMode(hStdin, mode & ~ENABLE_ECHO_INPUT));
ご自身で指摘されているように、Windows は現在でもconio.h
非エコー_getch()
(アンダースコア付き) を含めて提供しています。いつでもそれを使用して、手動で文字をエコーすることができます。_getch()
コンソールラインモードのオン/オフ、エコーのオン/オフスイッチを関数にラップするだけです。
編集:ここでは、の使用例を示すことを意図してい_getch()
ます。私はそれを適切に行うのに少し忙しいので、バグの可能性があるコードの投稿は控えました。
*nix では、おそらく curses/termcap/terminfo を使用したいと思うでしょう。よりスリムなアプローチが必要な場合は、低レベルのルーチンがtermios/tty_ioctlに文書化されています。
#include <sys/types.h>
#include <termios.h>
struct termios tcattr;
// enable non-canonical mode, get raw chars as they are generated
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ICANON;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);
// disable echo
tcgetattr(STDIN_FILENO, &tcattr);
tcattr.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSAFLUSH, &tcattr);