
linux的stdio不支持监听键盘的按键,你需要包含扩展的头文件和库。
比如包含termios.h,这个头文件里有一些终端IO的相关扩展。我们使用tcsetattr来设置一个属性,就可以不用回车就即时监听到按键。
#include <termios.h>//....其它代码
int in
struct termios new_settings
struct termios stored_settings
tcgetattr(0,&stored_settings) /* 把当前设置保存起来,以供恢复 */
new_settings = stored_settings
new_settings.c_lflag &= (~ICANON) /* 新设置,将canonical模式取消,屏蔽整行缓存 */
new_settings.c_cc[VTIME] = 0 /* 超时设置为0 */
new_settings.c_cc[VMIN] = 1 /* 读取的最小字符数 */
tcsetattr(0,TCSANOW,&new_settings)
in = getchar() /* 此时就可以正常的使用getchar()函数来获取一个输入了 */
/* 此时,你可以使用while,并将获得的输入进行处理 */
tcsetattr(0,TCSANOW,&stored_settings) /* 恢复原设置 */
另外,你可以考虑使用linux/input.h,使用事件监控的方式,来监控键盘事件。这个功能就强大多了,但是,这个 *** 作只适用于本机,也就是说,这个事件,只能监听到与主机直接相连的键盘和鼠标的事件。如果使用ssh登录过去的,是监听不到。关于具体用法,自己搜一下就好。
在Unix/Linux下,并没有提供int kbhit(void)这个函数。在linux下开发控制台程序时,需要自己编写kbhit()实现的程序了。下面是kbhit在Unix/Linux下的一个实现。用到了一种终端 *** 作库termios。下面是头文件kbhit.h:QUOTE:#ifndef KBHITh#define KBHIThvoid init_keyboard(void)void close_keyboard(void)int kbhit(void)int readch(void)#endif下面式源程序kbhit.c:QUOTE:#include "kbhit.h"#include <stdio.h>#include <termios.h>static struct termios initial_settings, new_settingsstatic int peek_character = -1void init_keyboard(){tcgetattr(0,&initial_settings)new_settings = initial_settingsnew_settings.c_lflag &= ~ICANONnew_settings.c_lflag &= ~ECHOnew_settings.c_lflag &= ~ISIGnew_settings.c_cc[VMIN] = 1new_settings.c_cc[VTIME] = 0tcsetattr(0, TCSANOW, &new_settings)}void close_keyboard(){tcsetattr(0, TCSANOW, &initial_settings)}int kbhit(){unsigned char chint nreadif (peek_character != -1) return 1new_settings.c_cc[VMIN]=0tcsetattr(0, TCSANOW, &new_settings)nread = read(0,&ch,1)new_settings.c_cc[VMIN]=1tcsetattr(0, TCSANOW, &new_settings)if(nread == 1) {peek_character = chreturn 1}return 0}int readch(){char chif(peek_character != -1) {ch = peek_characterpeek_character = -1return ch}read(0,&ch,1)return ch}欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)