混合freopen和ncurses

时间:2012-07-13 12:05:50

标签: c++ ncurses freopen

我在将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没有响应并且不时闪烁。

由于两个部分在独立使用时都能正常工作,我想在将它们按照我所缺失的顺序方式混合时会有一些警告。有没有人有线索?

1 个答案:

答案 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)