画面をクリアせずに呪いからGetchを使用するにはどうすればよいですか?
質問
私は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(Stable)とGnome Terminalを使用しています。
解決
使用する newterm()
それ以外の initscr()
, 、あなたは元気でなければなりません。そして、忘れないでください delscreen()
あなたがこのアドバイスに従うなら。
他のヒント
Mike.DLDによる回答を拡張して、これはSystem Curses Libraryを使用して、画面をクリアせずに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;
}
これらの理由のいずれかで、Cursesアプリケーションで画面がクリアされているのがわかります。
- あなたのプログラムが電話をかけます
initscr
(画面をクリアする)またはnewterm
最初に電話をかけずにfilter
, 、 また - 端子初期化は画面をクリアします(または、代替画面に切り替えることにより、クリアされているように見えます)。
後者の場合、NCURSESの代替画面機能をリセットすることで抑制できます。 enter_ca_mode
と exit_ca_mode
ヌルへのポインター で行われたように dialog
. 。さらに良いことに、必要なことを行う端末の説明を選択してください。
参考文献:
- VIを実行しているときに画面がクリアされないのはなぜですか? (Xterm FAQ)
基本的に、Cursesは、画面(またはウィンドウ)を引き継ぐように設計されています。呪いとStdioを実際に混ぜることはできません。また、呪いを使用して、画面の残りの部分をいじらずに何かを入力または出力するだけではありません。部分的な回避策がありますが、あなたは本当にあなたが望むようにそれを機能させることができることは決してありません。ごめん。
私はあなたのプログラムを書き換えて、呪いを通して呪いを使用するか、readlineのような代替案を調査することをお勧めします。