2013-05-22 34 views
4

我正在c/C++中实现一个密钥阅读器程序。我正在使用Linux。我知道,无缓冲的getchar函数将返回键的很少的数据值。对于所有ASCII键(a-z,A-Z,1-9,标点符号,输入,制表符和ESC),将会有一个从getchar()返回的值。对于其他键(如箭头键),将会读取ESC键,但是当再次调用getchar()时,它会得到另一个值(A,B,C或D)。C++ getchar()是否有数据仍在等待读取

A = 65

B = 66

UP箭头= 27 91 65

F5 = 27 91 49 53 126

ESC = 27

全表here

有什么方法可以检查是否有更多要读取的字符还是只有一个字符?当一个键被读取并且它的第一个值是ESC时,我不知道它是否是一个以ESC开头的功能键,或者它只是ESC键。

#include <stdlib.h> 
#include <stdio.h> 
#include <sys/ioctl.h> 
#include <iostream> 
#include <string> 
#include <termios.h> 
#include <unistd.h> 

using namespace std; 

int main(int argc, char *argv[]) { 

    int ch[5]; 
    int i; 
    struct termios term; 

    tcgetattr(STDIN_FILENO, &term); 
    term.c_lflag &= ~(ICANON | ECHO); 
    tcsetattr(STDIN_FILENO, TCSANOW, &term); 

    ch[0] = getchar(); 

    // If ch[0] = 27 and there is more data in the buffer 
    // printf("You pressed a function key"); 
    // Else 
    // printf("You pressed ESC"); 

    return 0; 

} 
+2

你的目标是什么操作系统? – paddy

+0

尝试在stdin上使用read并将stdin的属性设置为非块。读直到它返回一个大小为0. – bikram990

+1

如果您输入的字符超出了ASCII字符集中的内容 - 例如功能键或带有其他键的控制键 - 返回值通常没有意义。这些键在ANSI C定义之外,因此,在处理这些键和/或键组合时,getchar()的行为取决于系统。 –

回答

0

当你逃跑,然后读尽可能您可以标记STDIO非阻塞。 您需要包括<fcntl.h>

if (ch[0] == 27) { 
    int flags = fcntl(STDIN_FILENO, F_GETFL, 0); 
    fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); 
    for (;;) { 
     int c = getchar(); 
     if (c == EOF) 
      break; 
     printf("%u ", c); 
    } 
    fcntl(STDIN_FILENO, F_SETFL, flags); 
    puts("\n"); 
} 

还有与后对方为环两个键的问题会读,没有更多的数据可用,直到。

+0

你需要在某个时候调用'clearerr(stdin)';否则所有后续的'getchar'调用将返回EOF ... –

-1

在循环内添加getchar(),并在输入的键为ENTER时退出循环。 例如:

char ch[5]; 
int i=0; 
while(1) 
{ 
    ch[i] = getchar(); 
    if('\n'==ch[i]) 
    { 
    break; 
    } 
    i++; 
    if(i==5) 
    { 
    break; 
    } 

} 
+0

您可能想要注意写入ch缓冲区的末尾。 – Jason

+0

如果您输入5个以上的字符,将会导致缓冲区溢出。 –

+0

您可以使用std :: vector来避免该问题。 – dutt

0

获得第一个ESC字符后,您可以不等待地读取其他字符(例如,通过在termios结构中设置c_cc [VMIN] = 0和c_cc [VTIME] = 0),然后如果发现字符不匹配一个功能键模式,您可以将您已读取的字符插入缓冲区中以便回读。然后,在下一次让你首先返回缓冲的字符,如果有的话。