2011-01-23 3 views
8

C로 프로그래밍하는 것을 배우고 코드가 실행되는 동안 을 누르지 않고 문자를 터미널에 입력 할 수 있기를 원합니다. 내 프로그램은 작동하지만, initscr()으로 전화하면 filter()을 호출 한 후에도 화면이 지워집니다. filter에 대한 문서는 클리어링을 비활성화해야한다고 제안하지만 이는 저에게 해당하지 않습니다.화면을 지우지 않고 curses에서 getch를 사용하려면 어떻게해야합니까?

#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; 
} 

왜 위의 코드는 여전히 화면을 깨끗하게합니까?이를 해결하기 위해 수행 할 수있는 작업은 무엇입니까?

도움이된다면 데비안 레니 (stable)와 gnome-terminal을 사용하고 있습니다.

+0

: 파일 역사 : – Brandin

+0

PDC_PRESERVE_SCREEN 이 환경 변수가 만약을 이 설정되면 PDCurses는 시작할 때 화면의 검은 색 기본 설정 인 을 지우지 않습니다. 이를 통해 창을 기존 화면 배경 위에 덮을 수 있습니다. PDC_RESTORE_SCREEN 이 환경 변수가 설정된 경우 PDCurses는 PDCurses가 시작될 때 화면의 내용을 복사합니다. initscr(), 그리고 endwin()이 호출되면 화면이 복원됩니다. – Brandin

답변

2

initscr() 대신 newterm()을 사용하면 문제가 없습니다. 이 조언을 따르는 경우 delscreen()을 잊지 마십시오.

+0

안녕하세요, 응답 주셔서 감사합니다, 당신이 말한 것을 시도하고 기능이 동일합니다 - 화면이 다시 지워졌습니다. 'initscr()'대신'FILE * fild_id = fopen ("/ dev/tty", "r +"); 화면'termref = newterm (NULL, file_id, file_id); 그리고'endwin() 대신'delscreen (termref)'이 있습니다. –

+0

이상하지만'initscr()'대신 화면을 지우지 않습니다. 나는 그것을'newterm (NULL, stdin, stdout)'이라고 부른다. –

+3

화면을 지우지 않는 유일한 이유는 newterm()에 인수를 역전 한 것입니다. stdout, stdin, stdout, stdout이 아닙니다. 테스트 프로그램을 실행 한 후 입력 내용이 엉망이 될 것입니다. 아마도 에코하지 않습니까? newterm()에 대해 올바른 인수 순서를 사용하면 실제로 화면이 지워집니다. 당신의 대답은 틀 렸습니다. –

4

mike.dld의 대답을 확장하면 화면을 지우지 않고도 시스템 curses 라이브러리가있는 MacOS X 10.6.6 (GCC 4.5.2)에서 작동합니다. 입력 된 문자 ("x"파일에 기록됨) 및 CONTROL-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; 
} 
+0

답장을 보내 주셔서 감사합니다.이 작업은 완벽합니다. –

+0

그러면 화면이 나옵니다 (작동하지 않습니다). – nh2

+0

@ nh2 : 터미널 유형과 사용중인 curses 항목에 따라 다를 수 있습니다. –

0

기본적으로 curses는 화면 (또는 창 터미널의 경우에는 창)을 차지하도록 설계되었습니다. 저주와 stdio를 실제로 섞을 수는 없으며, 화면의 나머지 부분을 엉망으로 만들지 않고 단지 저주를 사용하여 입력이나 출력을 할 수는 없습니다. 부분적인 해결 방법이 있지만 실제로 원하는대로 작동하도록 만들 수는 없습니다. 죄송합니다.

나는 curses를 사용하도록 프로그램을 다시 작성하거나 readline과 같은 대안을 조사 할 것을 제안합니다.

당신은 당신의 화면에 다음 이유 중 하나에 대한 저주 응용 프로그램에서 지워 볼 것
+0

readline은 ncurses를 내부적으로 사용합니다. –

+1

readline은 termcap 인터페이스 만 사용합니다. –

1

:

프로그램이 처음 filter를 호출하지 않고 (화면을 지 웁니다) initscr 또는 newterm를 호출
  • , 또는
  • 터미널 초기화 화면을 지우거나 (대체 화면으로 전환하여 화면을 지우거나 보입니다).

후자의 경우에, 당신은 as done in dialog을 NULL로 enter_ca_modeexit_ca_mode 포인터를 재설정하여 ncurses를의 대체 화면 기능을 억제 할 수 있습니다. 더 나은 방법은 원하는 것을 수행하는 터미널 설명을 선택하는 것입니다.

추가 읽기 :

관련 문제