开关

2011-08-29 51 views
-1

我想和写作之间切换到文件到stdout 我不能使用fprintf,但像这样:开关

for(size_t i;i<100;++i) 
{ 
    if(i%2) 
    { 
     freopen("tmp","w",stdout); 
     printf("%d\n",i); 
    } 
    else 
    { 
     //return to write to stdout? 
     printf("%d\n",i); 
    } 
} 

哪有我回到写给stdout

更新

我编写跨平台的应用程序,不能使用dup

+2

重复http://stackoverflow.com/questions/1673764/freopen-reverting-back-to-original-stream。 –

+0

@ unkulunkulu - no – Yakov

+0

@Yakov,然后回答第一个问题。 – unkulunkulu

回答

2

千万不要使用freopen。它不能达到你想要的,这是一个非常危险的功能。如果失败,您唯一可以做的安全事情就是立即终止程序或确保stdout再也不会被访问。

有一种方法可以通过dupdup2在POSIX系统上执行所需操作。它看起来像这样:

fflush(stdout); 
int old_stdout = dup(1); 
int new_stdout = open("whatever", O_WRDONLY|O_CREAT, 0666); 
dup2(new_stdout, 1); 
close(new_stdout); 
/* use new stdout here */ 
fflush(stdout); 
dup2(old_stdout, 1); 
close(old_stdout); 
+0

我真的不确定你对“freopen”的基础是什么。有任何参考?另外,http://pubs.opengroup.org/onlinepubs/009695399/functions/freopen.html表示'freopen'通常用于将'stdin','stdout'和'stderr'重新附加到其他文件。 – Hasturkun

+0

在您提供的链接中查看此文本:“无论后续打开是否成功,原始流都应关闭。”因此,如果打开新文件失败,'stdout'被关闭,并且由于它被关闭,任何使用'stdout'(例如'printf')的函数现在使用一个无效的'FILE *',因此调用未定义的行为。 –

+0

我不认为有任何东西阻止你重新分配这些东西,所以你仍然可以优雅地处理它。 – Hasturkun

0

您需要dup文件描述符,然后重新打开到打开的描述符。你为什么不能使用fprintf? (这个作业吗?)

+0

不 - 不是作业 – Yakov

+0

@Yakov,'fprintf'有什么问题? –

+0

听起来像给我作业。 –