2009-07-09 50 views
0

所以我有一個C++程序,通常當它執行時把東西寫到日誌文件中。這是使用fstream完成的。但是,現在我想包含關閉註銷的功能。從本質上講,我的代碼看起來是這樣的:重定向C++ fstream

bool isLogging; 
fstream* logFilePtr; 

在我的代碼,還有一堆類似的語句:現在

(*logFilePtr) << " Kernel call time in seconds: " << kTime << endl; 
... 

,如果「isLogging」是真的,我不希望這些打印。我可以用一堆if語句把它們包圍起來,但我更喜歡比這更乾淨的東西。我認爲有一些方法可以將C++流重定向到「無」,這樣當使用運算符時,什麼都不會打印。

有誰知道如何將流重定向,或對如何以優雅的方式處理這個問題的任何其他的想法?

感謝, 科林

回答

6

你可以在一個類包起來。

class Log { 
    Log (fstream &s) : stream(s), enabled(false) { } 
    void Enable() { enabled = true; } 
    void Disable() { enabled = false; } 

    template<class T> 
    Log &operator<< (T const& rhs) { 
    if (enabled) stream << rhs; 
    return *this; 
    } 

private: 
    fstream &stream; 
    bool enabled; 
}; 

這沒有測試..但基本的想法應該在那裏。

0

平臺?如果您在UNIX下,你可以寫我使用POCO庫的日誌記錄功能的文件到/ dev/null的

+1

在windows下你可以使用NUL達到相同的效果 – 2009-07-09 15:10:58

0

。它支持配置頻道 - 控制檯,文件,兩者。配置輸出和記錄級別的格式(跟蹤,調試,錯誤等)。然後,我與周圍的功能日誌記錄功能,如

inline void logError(const std::string & str) 
{ 
#ifdef COMPILE_ERROR_LOGGING 
    g_pMyPocoLogger->error(str); 
#endif 
} 

您可以選擇不使用的庫,但我還是建議用包裝材料周圍的記錄。

4

看看rdbuf member function。您可以創建一個丟棄流緩衝區並將其與您的流關聯。

struct nullbuf: std::streambuf 
{ 
    int overflow(int c) { return traits_type::not_eof(c); } 
}; 
1

的std :: iostream的不允許操作系統級重定向,但是,您可以的std ::輸入輸出流之間共享的std ::的streambuf:

int main() { 
    // redirect stdout to stderr: 
    std::streambuf * const oldstdout = std::cout.rdbuf(); 
    std::cout.rdbuf(std::cerr.rdbuf()); 

    // test 
    std::cout << "Hello "; 
    std::cerr << "World" << std::endl; 

    // re-set, so streambufs are properly deleted: 
    std::cout.rdbuf(oldstdout); 

    // test 
    std::cout << "Hello "; 
    std::cerr << "World" << std::endl; 

    return 0; 
} 

這樣一來,你可以記錄重定向到在其他地方(例如「/ dev/null」:),或者,如果您遵循avakar的回答,請使用nullbuf。

0
std::ostream& Debug(int level) { 
    std::clog.clear(levell <= shown_level ? std::ios_base::goodbit: std::ios_base::badbit); 
    return std::clog; 
} 

comp.lang.c++

0

在「如何處理這個其他的想法」:

  1. 使用狀態模式來消除對周圍的所有代碼,如果檢查的需求。
  2. 使用帶有日誌記錄策略對象的策略模式(編譯時策略模式)。