freopen
-ing stdout
,如何在終端上打印?如何在使用freopen後在stdout中編寫
freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
freopen
-ing stdout
,如何在終端上打印?如何在使用freopen後在stdout中編寫
freopen("out", "w", stdout); // reopen stdout
/* something */
printf("Now I want to print this on terminal");
你可以做到這一點:
#include <fstream>
ofstream out("out.txt");
out<<"something";
then
cout<<"something";
這不回答問題 – SHR 2014-11-02 13:20:48
@SHR:讓誰問這個問題的人說,這是回答與否,可能是有用的爲他 – 2014-11-02 13:37:45
@darkdream歡迎您:) – 2014-11-02 13:58:56
我相信這是你在找什麼:
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)可能 有已從命令行重定向。
@SotiriosDelimanolis我不會想到c-faq.com會消失。但無論如何,做到了:) – 2014-11-02 16:49:07
代碼比英文更容易理解 - 您應該發佈它。 – anatolyg 2014-11-02 13:00:48
什麼操作系統?我相信,Windows不必然可以允許這個工作... – 2014-11-02 13:03:15
@MatsPetersson在Ubuntu – cijianzy 2014-11-02 13:04:05