默認情況下,控制檯是cooked mode(經典模式,行模式,...)。這意味着
- 它遞給你的應用程序
- 字符將通過控制檯驅動
通常會自動回顯到控制檯前,控制檯驅動程序緩存數據,這意味着你的程序只能在一行結束後獲得輸入,即當輸入時被按下。由於自動回顯,這些字符已經在屏幕上。
這兩種設置都可以獨立改變,但是其機制是--unfortunately--的操作系統特定的呼叫:
對於窗口是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()
的例子。我有點忙於正確地完成它,我避免發佈潛在的錯誤代碼。
下,您很可能希望使用詛咒/的termcap/terminfo的* nix中。如果你想要一個更精簡的辦法,低級程序都記錄在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);
標準C++庫中沒有這樣的東西。您需要編寫特定於平臺的代碼。 –