题
我正在学习在C中编程,并希望能够在我的代码运行时将字符键入终端,而无需按下 返回. 。我的程序有效,但是当我打电话时 initscr()
, ,清除屏幕 - 即使在打电话后 filter()
. 。文档 filter
建议它应该禁用清除 - 但是对我而言并非如此。
#include <stdio.h>
#include <curses.h>
#include <term.h>
int main(void) {
int ch;
filter();
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
while((ch = getch()) != EOF);
endwin();
return 0;
}
为什么上述代码仍然清除屏幕,该如何解决?
如果有帮助,我正在使用Debian Lenny(稳定)和Gnome末端。
解决方案
利用 newterm()
代替 initscr()
, ,那你应该没事的。而且不要忘记 delscreen()
如果您遵循此建议。
其他提示
将Mike.dld的答案扩展到MacOS X 10.6.6(GCC 4.5.2)上,系统诅咒库库 - 无需清除屏幕。我添加了记录键入字符(记录到文件“ x”)的功能,并且能够键入 控制D。 并停止程序而不是强迫用户中断。
#include <stdio.h>
#include <curses.h>
#include <term.h>
#define CONTROL(x) ((x) & 0x1F)
int main(void)
{
FILE *fp = fopen("x", "w");
if (fp == 0)
return(-1);
SCREEN *s = newterm(NULL, stdin, stdout);
if (s == 0)
return(-1);
cbreak();
noecho();
keypad(stdscr, TRUE);
int ch;
while ((ch = getch()) != EOF && ch != CONTROL('d'))
fprintf(fp, "%d\n", ch);
endwin();
return 0;
}
由于以下原因之一,您会在诅咒申请中看到您的屏幕:
在后一种情况下,您可以通过重置ncurs中抑制替代屏幕功能 enter_ca_mode
和 exit_ca_mode
指示为null 如完成 dialog
. 。更好的是,选择一个可以执行您想要的终端描述。
进一步阅读:
- 为什么在运行VI时屏幕不清除? (xterm常见问题解答)
基本上,诅咒被设计为接管屏幕(如果是窗户终端)。您无法真正将诅咒与STDIO混合在一起,也不能真正使用诅咒仅输入或输出某些内容而不弄乱其余的屏幕。有部分解决方法,但是您永远无法像听起来像您想要的那样使其正常工作。对不起。
我建议重写您的程序以在整个过程中使用诅咒,或者调查诸如Readline之类的替代方案。
不隶属于 StackOverflow