我正在整个互联网上寻找一些可以从键盘读取键而无需等待 LF 的功能(例如 conio.h 中的 getch() )。不幸的是,我必须使用开关 -ansi 和 -pedantic 使用 gcc 编译它,这使得 getch() 对我来说毫无用处。也许您知道其他符合标准的功能?
问问题
1598 次
1 回答
2
您可以使用标准setvbuf
功能来禁用缓冲(参见下面的示例)。请注意,这将导致从程序的角度禁用缓冲,但不会禁用终端中的缓冲(这也可能是您想要的)。示例代码:
#include <stdio.h>
int main()
{
char c;
setvbuf(stdin, 0, _IONBF, 0);
c = getc(stdin);
printf("read %c\n", c);
return 0;
}
像这样运行它仍然会从终端逐行读取输入,但只会消耗输入的第一个字符:
$ ./buf
ab
read a
$ b
删除该setvbuf
行将导致您的程序消耗整行输入。
如果仅使用 C 标准库,则没有可移植的方法来禁用终端的行缓冲,因为它不了解终端。
编辑:
一种 POSIX 可移植的方法是使用 termios 函数:
#include <stdio.h>
#include <unistd.h> /* for STDIN_FILENO */
#include <termios.h>
int main()
{
char c;
struct termios old, t;
tcgetattr(STDIN_FILENO, &old);
t = old;
cfmakeraw(&t);
tcsetattr(STDIN_FILENO, TCSANOW, &t);
c = getc(stdin);
tcsetattr(STDIN_FILENO, TCSANOW, &old);
printf("\rread %c\n", c);
return 0;
}
于 2012-10-16T19:55:50.697 回答