2011-06-27 44 views
1

我一直在使用Petru's logging framework。這是他的部分代碼:C++將格式化數據打印到std :: cout或文件(緩衝)

class Output2FILE 
{ 
public: 
    static FILE*& Stream() { 
    static FILE* pStream = stderr; 
    return pStream; 
    } 
}; 

這是非常好的,因爲它根本沒有記錄任何行動標準錯誤,但可以事後被設置成任何東西,包括stdout和文件的功能。不過,我認爲這種方法不能用於格式化數據,因爲需要使用fprintf。

因此,我試圖想出類似的東西,默認情況下可以使用stdout,並且可以切換到文件,但使用格式化數據的「< <」運算符。

也許隨着然後做myOutput << "Hello" << 1 << 1.5;想法沿線東西

std::ostream myOutput(std::cout); 

。但是,上面的代碼會讓編譯器抱怨。

什麼是正確的方法?

謝謝!

+3

AFAIK流是不可拷貝 –

+3

乾杯阿爾欽,導致簡單的答案真的。 'std :: ostream&myOutput(std :: cout);' – Cookie

回答

1

你可以用一個指針std::ostream很像FILE*版本。

std::ostream* os = &std::cerr; 
if (log_to_file) { 
    os = new std::ofstream("my.log"); 
} 

*os << "Hello Log!" << std::endl; 

if (log_to_file) { // or less 'safe' os != &std::cerr ... 
    // close file here 
} 
+1

確實。甚至是一個參考,它可以節省輸出線上的解除引用。 – Cookie

+0

我首先會提出這個建議,但是通過指針,您可以選擇在運行時重新定位 - 例如,如果創建日誌文件失敗。 – user786653

+0

是的。我實際上遇到了嘗試使用全局參考的問題。看起來指針確實更有意義。 – Cookie

0

我不太確定我正確理解你要找的東西。但它好像這一個可以幫助你:

#include <sstream> 

#define SSTR(x) (dynamic_cast< std::ostringstream & >(\ 
      (std::ostringstream() << std::dec << x)).str() 

用法:

SSTR("Hello" << 1 << 1.5); 

息率的std :: string(您可以再喂到你想要的任何輸出功能)。

詳盡的描述和解釋:http://dev.rootdirectory.de/trac.fcgi/wiki/SSTR%28%29

1

簡單的答案,真的

std::ostream& myOutput(std::cout); 

感謝