2013-01-24 83 views
0

我想寫一個流到一個FILE * fp同時該流應該被複制到另一個fp太有沒有更好的方法來寫我的調試函數通過消除一個fprintf?是否有一個API(如dup)複製fstream,因此它可以

const int logflag=1; 
#define debug(args ...) if (logflag) { FILE *flog = fopen("test.log", "a+"); fprintf(flog, args); fclose(flog); } fprintf(stderr, args); 

int main() 
{ 

    debug("test"); // writes test into both stderr and flog 
    debug("test2"); 
} 
+2

這似乎是在命令行中更好地處理。打印出日誌並讓Linux處理剩下的事情:'./prog 2>&1 | tee f.log' – Michael

回答

1

簡短的回答是否定的,它是兩個不同的文件指針,一次只能寫入一個。其實,dup還是不幫你,因爲它會關閉複製文件描述符:

"dup2() makes newfd be the copy of oldfd, closing newfd first if necessary" 

from the dup2 man-pages 

但是,如果你的目標是同時擁有一個日誌屏幕和一個文件,你是通過使用更好的服務Linux已經爲您提供了工具。一個很好的做法(我不記得這個來源)是讓程序打印它的輸出和調試到一個stdout/stderr並讓調用用戶決定如何處理輸出。

在此之後,如果所有的輸出去stderr,你可以做執行程序時,以下幾點:

$ ./program 2>&1 | tee file.log 
相關問題