2014-11-17 46 views
1

我想創建一個類流的類,通過它可以寫入std::outstd::clogC++同時寫入std :: out和std:clog

我有以下代碼,但問題是它只寫入到std::clog,而在控制檯上的輸出不是預期的(奇怪,它會覆蓋自己)。

struct Log : public std::ofstream 
{ 
    Log(const std::string filename) 
    : std::ofstream(filename.c_str()) 
    { 
     std::clog.rdbuf(this->rdbuf()); 
    } 
}; 

template <typename T> 
Log & operator << (Log & stream, const T & x) 
{ 
    std::cout << x; 
    std::clog << x; 
    return stream; 
}; 

我要的是這個

Log log("logfile.txt"); 
log << "this should go to the console and the logfile" << 1234 << std::endl; 

可以這樣做?

+0

我應該補充一點,我想保留'std :: out'完好無損,因爲我想在我的代碼的其他部分「按原樣」使用它。 – Stingery

回答

0

通常不需要手動編寫這樣一個裝置來將您的輸出指向幾個地方。

使用tee實用程序。

+1

您可能還會提到,T系統調用在C程序中的作用基本相同,這將允許用戶不使用單獨的程序。 – Vality

+0

不知道這是否是我的解決方案。我只是想區分我向控制檯寫入的內容和單獨的日誌文件,其中包含與控制檯上相同的信息,但還有更多的額外行。因此,我不想寫'std :: cout <<「info」; std :: clog <<「info」'(即兩次相同)每次打印到控制檯。 – Stingery

+0

@Vality不清楚_tee system call_引用了什麼。 –

1

我找到了一個(或「the」)解決方案!

添加以下代碼:

Log & operator << (Log & stream, std::ostream & (*f)(std::ostream&)) 
{ 
    std::cout << f; 
    std::clog << f; 
    return stream; 
} 

這增加功能以還例如接受std::endl(或std::ostream內的其他函數調用),現在其行爲如預期。