我一直在试图让getch
在没有成功的另一个程序的工作。 所以我做了我可以用最基本的程序getch
我希望它在主程序中的工作方式。
我研究的需要noecho
, cbreak
, initscr
和nodelay
,我也尝试使用newscr()
但没有成功。
我遇到的问题是,字符不被显示在屏幕上,直到我打“进”,当他们应该put
每一个循环的屏幕。 这究竟是为什么? 另外,光标不会在新线返回到屏幕的左侧。 例如。
abc
def
ghi
我一直在寻求答案,但我再次难倒...
#include <stdio.h>
#include <ncurses.h>
int main()
{
initscr();cbreak(); noecho();nodelay(stdscr,0);
char c ;
while((c=getch())!=EOF){
putchar(c);}
return 0;
}
你没有看到输出,因为你的stdout
流线缓冲。
你的程序越来越单个字符的所有权利; 但输出流被缓冲。
尝试fflush(stdout);
或切换stdout
到缓冲模式与setbuf(stdout, NULL);
。
与禁用缓冲的问题是,它是低效率的批量数据处理时的输出是不是一个终端。
你可以把它有条件在标准输出是一个TTY:
if (isatty(fileno(stdout))) /* #include <unistd.h> */
setbuf(stdout, NULL);
要返回光标到行的开始,你需要拿出一个回车\r
。 这是因为,诅咒cbreak
模式已禁用ONLCR
TTY模式(输出,发送时NL添加CR)。
如果无条件地添加\r
,那么当你的输出重定向它将出现在文件中。 所以,再一次,你需要一些isatty
黑客。
一个更好的可能是学习如何使用tcgetattr
和tcsetattr
函数来精确控制特定tty参数,如果你想要的是做字符在-A-时间输入无回声,并没有真正建立一个互动的基于光标的计划。
难道你真的想要的字符在-A-时间输入,或者只是魔鬼的回声? 这很容易禁止回声。 调用tcgetattr
填充struct termios
与文件描述符0的当前设置(如果它是一个TTY)。 翻转一些标志关闭呼应,然后调用tcsetattr
安装更新的结构。 当你的程序退出,是好的,放回到原来的一个。 完成。
是的,ncurses的是一个很好的方式来获得字符一个字符的控制。
是的,你必须调用 “initscr的()” 和 “CBREAK()”。
几点建议:
1)比较你的代码与此NCURSES的 “Hello World”:
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}
2)看看你做一个“刷新()”和/或删除“NOECHO()”发生了什么。
3)本教程有很多很好的信息,可能也有帮助:
http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/