簡體   English   中英

重定向C ++ fstream

[英]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 ++

在“關於如何處理此問題的其他想法”下:

  1. 使用狀態模式可以消除對所有代碼進行if檢查的需要。
  2. 將策略模式(編譯時策略模式)與Logging策略對象一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM