2014-02-12 51 views
1

我已經制作了一個小程序,可以將光標向上,向下,向左和向右移動。寫入stdin,然後將流移回1位置

現在我想添加的最後一件事是如果光標到達屏幕的邊緣,光標可以跳到下一個或上一個。

因爲我已經實現了各種檢查,以確保我可以在key_up和key_down輸入句柄部分內上下移動,所以我想'借用'這些。我當然可以重寫它們並在key_left和key_right方案中重用它們。

但是,如果我只是寫入標準輸入和'假'用戶輸入就好像按下了key_up或key_down一樣,只需更改光標的x位置就可以了。

所以我想是這樣的

putc(KEY_UP,stdin);fseek(stdin,-1, SEEK_CUR); 

因此下一次的getch()它檢索我放到標準輸入與putc將字符!

我使用ncurses爲整個程序接口!

關於Filipe建議我試圖用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例程將ch放回到輸入隊列中,以便在下一次調用wgetch時返回 。所有 窗口只有一個輸入隊列。

函數原型:

int ungetch(int ch); 

它返回成功完成後在失敗的整數ERR等相比ERR(在ungetch()情況OK)的整數值。

爲了將來參考之用

如果有人讀這個答案想要一個簡單的方法來字符逼退到一個文件流,ungetc()是正確的做法。 ungetch()僅適用於任何使用ncurses的人。

ungetc()推回一個字符到給定的文件流:

int ungetc(int c, FILE *stream); 

從手冊頁:

ungetc函數()推C返回到流,轉換爲無符號的字符,它是 可用於後續的讀取操作。後退字符將以相反的順序返回,即 ;只保證一個後退。

你會想stdin調用它,如:

ungetc((unsigned char) KEY_UP, stdin); 

它返回c成功,EOF上的錯誤。請記住,它只保證一個推回的字符;您不能撥打ungetc()兩次,然後預計撥打getch()兩次會返回最後2個推送的字符。

+0

這正是我所期待的。但它似乎並不奏效。我在原始文章中添加了一個小例子! – RG337

+0

您是否將它作爲'unsigned char'傳遞給'ungetc()'? –

+0

是的,嘗試有和沒有。該示例現已發佈。 thx的幫助:) – RG337

相關問題