2014-11-02 23 views
0

freopen -ing stdout,如何在終端上打印?如何在使用freopen後在stdout中編寫

freopen("out", "w", stdout); // reopen stdout 
/* something */ 
printf("Now I want to print this on terminal"); 
+1

代碼比英文更容易理解 - 您應該發佈它。 – anatolyg 2014-11-02 13:00:48

+0

什麼操作系統?我相信,Windows不必然可以允許這個工作... – 2014-11-02 13:03:15

+0

@MatsPetersson在Ubuntu – cijianzy 2014-11-02 13:04:05

回答

-4

你可以做到這一點:

#include <fstream> 

ofstream out("out.txt"); 

out<<"something"; 

then 

cout<<"something"; 
+5

這不回答問題 – SHR 2014-11-02 13:20:48

+1

@SHR:讓誰問這個問題的人說,這是回答與否,可能是有用的爲他 – 2014-11-02 13:37:45

+1

@darkdream歡迎您:) – 2014-11-02 13:58:56

6

我相信這是你在找什麼:

Once I've used freopen, how can I get the original stdout (or stdin) back?

有沒有便攜式解決方案。但該鏈接還解釋了一種可能的解決方案,它使用您自己的流和可在大多數posix系統上工作的non-portable解決方案。

有沒有一個好方法。如果你需要切換回來,最好的解決方案 不是首先使用freopen。嘗試使用您自己的 顯式輸出(或輸入)流變量,您可以在 處重新分配該變量,同時保持原始標準輸出(或標準輸入)不受干擾。對於 例如,聲明一個全局

FILE *ofp; 

,並更換所有調用的printf(...)與fprintf中(OFP,...)。 (很顯然,你必須檢查putchar和put的調用。) 然後你可以設置top爲stdout或其他任何東西。

你可能不知道,如果你能跳過freopen函數完全,並做一些 像

FILE *savestdout = stdout; 
stdout = fopen(file, "w"); /* WRONG */ 

離開自己能夠恢復標準輸出後來通過做

stdout = savestdout;  /* WRONG */ 

,但這樣的代碼是不太可能工作,因爲stdout(和stdin 和stderr)通常是不能重新分配的常量(其中 是爲什麼freopen首先存在)。

在調用freopen在其位置打開某個文件之前,以非移植方式保存有關流的信息 ,以便稍後可以恢復原始流。如果 可用,最直接和最可靠的方法是使用特定於系統的調用(如dup或dup2)操作基礎文件 描述符。另一種是複製或檢查FILE 結構的內容,但這是非常不便和不可靠的。

在某些系統中,你也許能夠重新打開一個特殊的設備文件 (例如/ dev/FD/1下的現代版本的Unix),這仍然是 連接到(例如)原來的標準輸出。你可以在 的某些系統上明確地重新打開控制終端,但這個 不一定是你想要的,因爲原來的輸入或輸出 (即什麼stdin或stdout之前你叫freopen)可能 有已從命令行重定向。

+2

@SotiriosDelimanolis我不會想到c-faq.com會消失。但無論如何,做到了:) – 2014-11-02 16:49:07

相關問題