我在与 ncurses 库混合freopen
时遇到问题。stdin
我所做的是将标准输入重新打开到一个文件,通过 flex+bison 解析它,然后我应该将它恢复回来并启动 ncurses。
交换代码如下:
void switchStdin(const char *newStream) {
fflush(stdin);
fgetpos(stdin, &pos);
fd = dup(fileno(stdin));
freopen(newStream, "r", stdin);
}
void revertStdin() {
fflush(stdin);
dup2(fd, fileno(stdin));
close(fd);
clearerr(stdin);
fsetpos(stdin, &pos);
}
在我的词法分析器中,这就是我所做的:
void parse() {
Utils::switchStdin("./filename.ext");
yyparse();
Utils::revertStdin();
}
在主文件中我只是做类似的事情
parse();
initscr();
keypad(stdscr, TRUE);
noecho();
cbreak();
...
现在,如果我不评论revertStdin
它只是在启动时停止,如果我评论它,解析确实有效,但 ncurses gui 没有响应并且不时闪烁。
由于这两个部分在独立使用时都可以工作,我猜想以我错过的顺序方式混合它们有一些警告。有人有线索吗?