2008-12-17 64 views
3

我有一個是做一些像Windows的C++程序:
改變標準輸出的一個C值++程序

 
    FILE* pf = ...; 
    *stdout = *pf; // stdout is defined in stdio.h 

我在尋找,當你改變標準輸出的價值會發生什麼情況的說明文件句柄。這只是一種重定向標準輸出的方式?

-CR

+0

我想過關於在過去做這件事,從來沒有,因爲我還沒有找到一個好的答案 – warren 2008-12-17 21:51:48

回答

4

如果通過分配,而不是使用指定的工具改變stdout(在C,freopen()正如亞當羅森菲爾德說 - 推而廣之,在C++),那麼你會把自己暴露給各種債務。

  • 目前還不清楚cout也將被重定向。
  • 您可能會泄漏文件描述符(這可能無關緊要)。
  • 您可能無法正確刷新原始標準輸出 - 丟失信息。
  • 您可能會泄漏與原始文件指針相關的內存(這可能無關緊要)。
  • 如果有什麼東西關閉pf,那麼你應該承擔雙倍免費錯誤(崩潰)。

乾淨地完成工作要好得多。

(演示代碼並不一定是寫的,或者甚至,在供應商的編碼隊中最有經驗的人的審查。如果它看起來可疑,可能是因爲它是可疑的。)

+1

最重要的是,你調用**未定義的行爲**。 C標準非常清楚地表明,使用`FILE`代替原來的調用UB,我相信C++標準將與C一致。 – 2011-06-08 16:37:45

6

是的,當你改變標準輸出,你有效地重定向到其它地方。但是,您應該將而不是直接分配給像那樣的stdout。如果你想重定向標準輸出,你應該改用freopen()

您不應該直接操作FILE對象 - 您應該將它們視爲不透明類型,並且只能通過<stdio>庫中的函數與它們交互。喬納森列舉了一些很好的理由。

從C99標準,7.19.3節第6段:

用於控制流可以是顯著的文件對象的地址;一個 文件對象的副本不需要代替原始文件。

+0

我沒有寫這個代碼。它來自工具包供應商的一些示例代碼。 – criddell 2008-12-17 21:51:44

相關問題