2014-02-12 2 views
1

커서를 위, 아래, 왼쪽 및 오른쪽으로 이동할 수있는 작은 프로그램을 만들었습니다.stdin에 기록한 다음 스트림을 1 위치 뒤로 이동

이제 마지막으로 추가 할 항목은 커서가 화면 가장자리로 이동하면 커서가 다음 또는 이전으로 건너 뛰는 기능입니다.

내가 이미 'key_up'과 'key_down'입력 핸들 부분에서 위아래로 이동할 수 있는지 확인하기 위해 모든 종류의 체크를 구현했기 때문에. 물론 key_left와 key_right 시나리오에서 재사용하고 재사용 할 수 있습니다.

그러나 key_up 또는 key_down이 눌린 것처럼 stdin 및 'fake'사용자 입력에 쓸 수 있으면 커서의 x 위치 만 변경하면 길어집니다.

그래서이

다음 getch에
putc(KEY_UP,stdin);fseek(stdin,-1, SEEK_CUR); 

그래서 같은 것을() 그것은 내가 putc와 표준 입력에 넣어 문자를 검색하여 원하는!

전체 프로그램 인터페이스에 ncurses를 사용합니다!

on Filipe suggestions ungetc()를 사용하여 작업을 시도했지만 원하는 동작이 없습니다.

여기 이론적으로는 첫 번째 문자 후에 무한 페이지의 인쇄해야합니다 작은 테스트 프로그램이지만하지 않습니다

#include <stdio.h> 
#include <stdlib.h> 
#include <ncurses.h> 

int main() { 
    int  input,i=0; 

    initscr(); 
    start_color(); 
    keypad(stdscr, TRUE); 
    raw(); 
    nonl(); 
    noecho(); 

    do { 
     input=getch(); 
     if (i==24) {i=0;erase();} 
     mvprintw(i,0,"%c --- %i",input,input); 
     refresh(); 
     if (ungetc((unsigned char)'p', stdin)==EOF) { 
      printw(" ERROR UNGETC"); 
     } 
     else {printw(" SUCCES UNGETC");} 
     ++i; 
    } while (input!='q'); 
    endwin(); 
    exit(2); 
} 

답변

1

당신의 ncurses를 사용하고 있기 때문에, 당신은 ungetch() 찾고 있습니다. 맨 페이지에서 :

ungetch 일상적인 장소 wgetch하기 위해 다음의 호출에 의해 을 돌려 다시 입력 큐에 ch가. 모든 창에 대해 하나의 입력 큐가 있습니다.

함수 프로토 타입 :

이 성공적으로 완료시 실패시 정수 ERR과 ( ungetch()의 경우 OK) ERR 이외의 정수 값을 반환
int ungetch(int ch); 

. 나중에 참조 할 수 있도록

이 대답을 읽는 사람이 파일 스트림에 문자를 다시 밀어 간단한 방법을 원하는 경우

ungetc() 올바른 접근 방법이다. ungetch()은 ncurses를 사용하는 사람에게만 적합합니다.

()가 그것 이고, 서명 숯불 캐스트, 스트리밍 다시 C를 ungetc 밀어

: 맨 페이지에서

int ungetc(int c, FILE *stream); 

:

ungetc() 다시 주어진 파일 스트림에 한 문자를 못살게 굴지 후속 읽기 작업에 사용할 수 있습니다. 푸시 백 문자는 의 역순으로 반환됩니다. 단 하나의 푸시 백이 보장됩니다.

당신은 같이 stdin로 전화를 할 것입니다

:

ungetc((unsigned char) KEY_UP, stdin); 

그것은 오류에 성공 c, EOF 반환합니다. 원 푸시 백 문자 만 보장한다는 점에 유의하십시오. ungetc()을 두 번 호출 할 수없고 getch()을 두 번 호출하면 마지막 2 밀리 문자가 반환됩니다.

+0

정확히 내가 찾던 내용입니다. 그러나 그것은 작동하지 않는 것 같습니다. 내 원래 게시물에 작은 예제를 추가했습니다! – RG337

+0

'ungetc()'에'unsigned char'로 전달 했습니까? –

+0

예, 사용해 보았습니다. 예가 지금 게시됩니다. thx : – RG337

관련 문제