C ++ getchar()是否有数据仍在等待读取

时间:2013-05-22 05:02:32

标签: c++ c getchar

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

A = 65

B = 66

向上箭头= 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;   

}

3 个答案:

答案 0 :(得分:0)

您可以在逃脱时标记stdio非阻塞,然后尽可能多地阅读。 您需要包含&lt; fcntl.h&gt;

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");
}

两个键之后仍然存在问题,因为循环将会读取,直到没有更多数据可用。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

在循环中添加getchar(),当输入的密钥为ENTER时退出循环。 例如:

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

}