2011-05-01 23 views
11

Trato de redirigir la salida en mi programa C++ desde la salida estándar con lo siguiente:Cómo restaurar la salida estándar después de usar freopen

freopen(cmd.c_str(),"w",stdout);  

Entonces llamada al sistema para ejecutar cmd. También he intentado bifurcar y luego llamar a execvp. De cualquier manera, cuando el control del programa regrese a mi programa, las cosas escritas en stdout ya no se muestran. ¿Cómo se puede restaurar el comportamiento normal?

+0

posible duplicado de [Cómo redirigir la salida de nuevo a la pantalla después de freopen ("out.txt", "una ", stdout)] (http://stackoverflow.com/questions/1908687/how-to-redirect-the-output-back-to-the-screen-after-freopenout-txt-a-stdo) – sfink

Respuesta

1

hacer esto:

fclose(stdout); 
stdout = fdopen(1, "w"); //reopen: 1 is file descriptor of std output 

Si puede utilizar STDOUT_FILENO de <unistd.h>, en lugar de 1 como primer argumento a fdopen.

+2

fdopen() falla con el error "descriptor de archivo incorrecto", porque después de haber llamado a fclose(), este descriptor ya no existe. – VladV

3

Aquí hay una solución para stdin si se hace en loop, necesario para resolver esto para un programa en el que freopen de stdin ocurre en un bucle en alguna condición. Tomó un tiempo para mí averiguar (con ayuda de búsqueda y de todo) y lo que la publicación aquí

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; 
     } 
     . 
     . 

} 
Cuestiones relacionadas