[英]Redirecting C++ fstream
因此,我有一個C ++程序,該程序通常在執行時將內容寫到日志文件中。 這是使用fstream完成的。 但是,現在我要包含關閉日志記錄的功能。 本質上,我的代碼如下所示:
bool isLogging;
fstream* logFilePtr;
在我的整個代碼中,有一堆語句如下:
(*logFilePtr) << " Kernel call time in seconds: " << kTime << endl;
...
現在,如果“ isLogging”為true,則我不想打印這些。 我可以用一堆if語句包圍它們,但是我更喜歡比這更干凈的東西。 我以為有一種方法可以獲取C ++流並將其重定向為指向“無”,以便使用<<操作符時,不會輸出任何內容。
有誰知道如何重定向流,或者對如何以一種優雅的方式處理流有其他想法?
謝謝,科林
您可以將其包裝在一個類中。
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;
};
這未經測試..但是基本思想應該存在。
看一下rdbuf
成員函數 。 您可以創建一個廢棄的流緩沖區,並將其與流關聯。
struct nullbuf: std::streambuf
{
int overflow(int c) { return traits_type::not_eof(c); }
};
std :: iostream不允許操作系統級重定向,但是,您可以在std :: iostreams之間共享std :: streambufs:
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。
平台? 如果您使用的是Unix,則可以將該文件寫入/ dev / null
我使用POCO庫的日志記錄功能。 它支持配置通道-控制台,文件和兩者。 配置輸出和日志記錄級別的格式(跟蹤,調試,錯誤等)。 然后,我將記錄功能與諸如
inline void logError(const std::string & str)
{
#ifdef COMPILE_ERROR_LOGGING
g_pMyPocoLogger->error(str);
#endif
}
您可以選擇不使用該庫,但我仍然建議您使用包裝器來記錄日志。
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 ++ 。
在“關於如何處理此問題的其他想法”下:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.