我在将freopen
stdin
与ncurses库混合时出现问题。
我所做的是将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没有响应并且不时闪烁。
由于两个部分在独立使用时都能正常工作,我想在将它们按照我所缺失的顺序方式混合时会有一些警告。有没有人有线索?
答案 0 :(得分:0)
有多个问题,但重要的是switchStdin
无法成功打开流:
fflush(stdin)
不必要地调用了不可移植的stdin
。fd
中的pos
的文件描述符和revertStdin
中的文件位置保存。fflush(stdin)
不必要地调用了不可移植的stdin
。fd
覆盖stdin
的文件描述符。那不会起作用。fdopen
分配新值;碰巧是GNU C library allows this。如果您正在使用Linux,则可以使用initscr
解决问题,例如,stdin = fdopen(fd, "r");
newterm
而不是initscr
。与newterm
不同,fdopen
允许您指定输入和输出的流。在这种情况下,您仍然会使用stdin
,但不会尝试分配给newterm
。使用您自己的变量并将 传递给group_1 = [4.1, 5.5, 3.2, 3.3, 6.1, 3.9, 4.7]
group_2 = [7.0, 3.8, 6.2, 6.1, 4.4, 4.9, 3.0]
group_3 = [5.5, 5.1, 3.9, 4.3, 4.9, 3.2, 3.2]
over_4_feet = Proc.new { |height| height >= 4 }
can_ride_1 = group_1.select(&over_4_feet)
can_ride_2 = group_2.select(&over_4_feet)
can_ride_3 = group_3.select(&over_4_feet)
。