linux下kbhit的头文件,linux下kbhit()使用
最近寫(xiě)一段程序,因?yàn)閯倢W(xué)linux學(xué)習(xí)網(wǎng)絡(luò)編程,編個(gè)聊天軟件(有一個(gè)功能就是可以選擇讓對(duì)方顯示自己的輸入過(guò)程),因?yàn)榇蛩阍谳斎胱址懊婕由详欠Q(chēng),因此我計(jì)劃是通過(guò)判斷鍵盤(pán)輸入來(lái)確定是否要輸入信息,在網(wǎng)上找了關(guān)于這方面的內(nèi)容,其中最多的就是各種kbhit()函數(shù)在linux中實(shí)現(xiàn),最開(kāi)始是做的是這樣做的:
首先,在網(wǎng)上找到了kbhit()函數(shù)的實(shí)現(xiàn):
int kbhit(void)
{
struct termios oldt, newt;
int ch;
int oldf;
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);
ch = getchar();
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
fcntl(STDIN_FILENO, F_SETFL, oldf);
if(ch != EOF)
{
ungetc(ch, stdin);
return 1;
}
return 0;
}
因?yàn)樯鲜龊瘮?shù)肯定在輸入時(shí)肯定會(huì)在屏幕上顯示出來(lái),為了不讓其顯示,在ch = getchar();? 前面加上一句system('stty -echo");并用一個(gè)全局變量c將ch字符保存起來(lái),
然后在程序中調(diào)用大概流程是:
while(1)
{
if(kbhit())
{
cout<
.......
}
}
但是這個(gè)程序不對(duì),因?yàn)樵谳斎脒^(guò)程中還是會(huì)在屏幕上顯示,而且不知道為什么以后c的值保持不變,而且kbhit()返回值都是1,即使我不按鍵的時(shí)候都是,這個(gè)把我糾結(jié)半天,然后網(wǎng)上尋求答案,可能是經(jīng)驗(yàn)問(wèn)題,沒(méi)有找到,最后陰差陽(yáng)錯(cuò),在不讓對(duì)方顯示自己的輸入過(guò)程時(shí)用到gets()函數(shù)就可以了,所以在這個(gè)程序中將? cout<
改為getc(stdin);然后就好了,后來(lái)上網(wǎng)查找原因,感覺(jué)應(yīng)該和gets()/getc()輸入機(jī)制有關(guān),因?yàn)榫幊探?jīng)驗(yàn)和對(duì)系統(tǒng)機(jī)制知識(shí)不足,具體原因我也不是很清楚,所以寫(xiě)這篇文章是希望像我這樣的初學(xué)者能夠很好的解決一些問(wèn)題,同時(shí)也希望大神們知道答案的請(qǐng)私信我,告訴我答案,我會(huì)非常感謝的!
最后祝大家愉快!
總結(jié)
以上是生活随笔為你收集整理的linux下kbhit的头文件,linux下kbhit()使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 我终于解救了系统盘ORZ
- 下一篇: VS将复制过来的文件或文件夹显示到解决方