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

C 写入stdin,然后将流移回1位置,c,stdin,ncurses,seek,C,Stdin,Ncurses,Seek,我已经做了一个小程序,在那里我可以上下左右移动光标 现在我想添加的最后一件事是,如果光标到达屏幕边缘,它可以跳到下一个或上一个 由于我已经执行了各种检查,以确保我可以在按键向上和按键向下输入手柄部件内上下移动,因此我想“借用”这些部件。我当然可以重写它们,并在左右键场景中重用它们 然而,如果我可以像按了向上键或向下键一样写入标准输入和“伪造”用户输入,并且只需更改光标的x位置,则时间会短得多 那么我想要什么呢 putc(KEY_UP,stdin);fseek(stdin,-1, SEEK_CUR

我已经做了一个小程序,在那里我可以上下左右移动光标

现在我想添加的最后一件事是,如果光标到达屏幕边缘,它可以跳到下一个或上一个

由于我已经执行了各种检查,以确保我可以在按键向上和按键向下输入手柄部件内上下移动,因此我想“借用”这些部件。我当然可以重写它们,并在左右键场景中重用它们

然而,如果我可以像按了向上键或向下键一样写入标准输入和“伪造”用户输入,并且只需更改光标的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);
}
#包括
#包括
#包括
int main(){
int输入,i=0;
initscr();
启动颜色();
键盘(stdscr,真);
原始();
诺尔();
noecho();
做{
输入=getch();
如果(i==24){i=0;erase();}
mvprintw(i,0,“%c---%i”,输入,输入);
刷新();
if(ungect((无符号字符)'p',stdin)=EOF){
printw(“错误等”);
}
else{printw(“success UNGETC”);}
++一,;
}while(输入!='q');
endwin();
出口(2);
}

因为您使用的是ncurses,所以您正在寻找
ungetch()
。从手册页:

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

功能原型:

int ungetch(int ch);
失败时返回整数
ERR
,成功完成时返回除
ERR
以外的整数值(
OK
,如果
ungetch()

仅供将来参考

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

ungect()
将一个字符向后推到给定的文件流中:

int ungetc(int c, FILE *stream);
从手册页:

ungect()将c推回流,强制转换为未签名字符 可用于后续读取操作。被推回的字符将 按相反顺序返回;只保证一次后推

您需要使用
stdin
调用它,如下所示:

ungetc((unsigned char) KEY_UP, stdin);

成功时返回
c
,错误时返回
EOF
。请记住,它只保证一个推回字符;你不能两次调用
ungect()
,然后期望两次调用
getch()
会返回最后两个推送字符。

这正是我要找的。然而,它似乎不起作用。我在我原来的帖子中添加了一个小例子!您是否将其作为未签名字符传递给了
ungect()
?是的,尝试了带和不带。这个例子现在发布了。谢谢你的帮助:)哼。。。
getch()
的代码是什么?如果您使用
getchar()
getc()
,这应该可以工作
getch()
可能在做一些讨厌的事情,把ncurses库中的
ungetc()
its弄得乱七八糟,据我所知,它是从stdin中读取的