2

ncurses ライブラリとの混合freopenに問題があります。stdin

私がやっていることは、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 は応答せず、時々点滅します。

両方の部分は独立して使用すると機能するため、それらを順次混合する際に、私が見逃しているいくつかの注意点があると思います. 誰も手がかりを持っていますか?

4

1 に答える 1