写入stdin然后将流移回1个位置

时间:2014-02-12 11:54:19

标签: c stdin ncurses seek

我做了一个小程序,我可以向上,向下,向左和向右移动光标。

现在我想要添加的最后一件事就是当光标到达屏幕边缘时光标可以跳转到下一个或上一个。

因为我已经实现了各种检查以确保我可以在key_up和key_down输入句柄中上下移动,我想“借用”这些。我当然可以重写它们并在key_left和key_right场景中重用它们。

然而,如果我只能写入stdin和'假'用户输入,就像按下key_up或key_down一样,只需更改光标的x位置,就会更短。

所以我想要这样的东西

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

所以在下一个getch()中它会检测我用putc放入stdin的字符!

我在整个程序界面使用ncurses!

关于Filipe建议我试图用ungetc()做一些事情,但它没有我想要的行为。

这是一个小型的测试程序,理论上它应该在第一个字符之后打印出无限的p,但它不会:

#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 个答案:

答案 0 :(得分:1)

由于您正在使用ncurses,因此您正在寻找ungetch()。从联机帮助页:

  

ungetch例程将ch放回要返回的输入队列   下次打电话给wgetch。所有人只有一个输入队列   窗户。

函数原型:

int ungetch(int ch);

失败时返回整数ERR,成功完成后返回除ERR以外的整数值(OK ungetch())。

仅供将来参考

如果有人在阅读此答案时想要一种简单的方法将字符推回到文件流中,ungetc()是正确的方法。 ungetch()仅适用于使用ncurses的任何人。

ungetc()将一个字符推回到给定的文件流中:

int ungetc(int c, FILE *stream);

从联系手册:

  

ungetc()将c推送回流,转换为unsigned char,它就在那里   可用于后续读取操作。推回字符会   以相反的顺序返回;只保证一次回击。

您需要使用stdin进行调用,如:

ungetc((unsigned char) KEY_UP, stdin);

成功时返回c,错误时返回EOF。请记住,它只能保证一个后推角色;您无法再拨打ungetc()两次,然后期望两次调用getch()会让您回到最后2个推送的字符。