Вот решение для stdin, если оно выполняется в цикле, необходимо выяснить это для программы, в которой freopen of stdin происходит в цикле при некоторых условиях.Мне потребовалось некоторое время, чтобы выяснить (с помощью поиска и все) и поэтому размещать здесь
savestdin = dup(STDIN_FILENO);
while (1) {
.
.
if (inputfile) {
savestdin = dup(savestdin);
freopen(inputfile, "r", stdin);
restorestdin = TRUE;
}
.
.
if (restorestdin) {
fflush(stdin);
fclose(stdin);
stdin = fdopen(savestdin, "r");
restorestdin = FALSE;
}
.
.
}