開關

2011-08-29 64 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

聽起來像給我作業。 –