2009-11-19 96 views
5

有沒有辦法在代碼中重定向C++輸出? 情況是這樣的,我正在使用一些外部的.cpp和.h文件,它們使用printf將警告發送到控制檯。我希望只將這些輸出(不是我的)「重定向到一個文件」沒有「修改他們的代碼。C++重定向輸出

所以;在我的程序中,我可以將輸出重定向到一個文件,並且當我將一些輸出重定向到默認控制檯時,之後再重新生成文件,等等......

這可能嗎?

回答

7

你可以在stdout上使用freopen()將stdout重定向到一個文件。

+0

+1爲做標準兼容(和便攜)的事情。 – DevSolar 2009-11-19 14:46:44

+0

是否在程序結束前以某種方式執行?我需要以某種方式將其轉換回控制檯嗎? – 2009-11-19 17:42:33

1

printf將打印到文件描述符1,您可以關閉它並打開一個文件,這會給你另一個fd,可能是1,因爲它的最低fd可用,如果不是你不夠快。

如果你只是close(1);然後int fd = open(file);如果在close和open之間沒有打開任何東西,fd應該是1。此時,任何輸出到fd號碼1的人都將打印到您的文件。

這是因爲系統應該給你lowest available file descriptor number所以它會給你1,這正是printf寫入的地方。

由於@roe提到你可能更喜歡首先做一個dup(),以獲得另一個可以打印到標準輸出的fd數字。

+0

如果你想繼續打印你自己的東西來標準輸出,你應該先'dup()'。然後你可以用'dup2()'來回切換。 – falstro 2009-11-19 14:44:29

+0

或直接寫入你自己的數據到被騙的FD ...我想這會更好。仍然需要重複它。 – falstro 2009-11-19 14:45:02

+0

當然,假設一個POSIX系統,即使這樣,你在做重新打開()完全符合法案的潛在危險的事情。 C庫和POSIX 混合不好。我會一直保持open()/ read()/ write()/ close()和fopen()/ fread()/ fwrite()/ fclose()。 – DevSolar 2009-11-19 14:46:08