如何在使用freopen后恢复stdout

时间:2011-05-01 05:36:29

标签: c++ redirect stdout

我尝试使用以下内容从stdout重定向我的c ++程序中的输出:

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

然后我调用system来执行cmd。我也尝试过分叉然后调用execvp。无论哪种方式,当程序控制返回到我的程序时,写入stdout的内容不再显示。如何恢复正常行为?

2 个答案:

答案 0 :(得分:3)

这里是stdin的解决方案,如果进行循环,需要计算出一个程序,其中stdin的freopen在一些条件下循环发生。花了一些时间让我弄清楚(借助搜索和所有)并在此处发布

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

} 

答案 1 :(得分:1)

这样做:

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

如果您可以使用<unistd.h>中的STDOUT_FILENO而不是1作为fdopen的第一个参数。