2011-06-27 3 views
1

私はPetru's logging frameworkを少し使っています。しかし、その後stdoutとファイルなど、何にでも設定することができます機能と、それは単に任意のアクションなしで標準エラー出力にログに記録として非常にいいですC++フォーマットされたデータをstd :: coutまたはファイル(バッファ)に出力する

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

:これは彼のコードの一部です。しかし、私は、fprintfを使う必要があるので、このアプローチをフォーマットされたデータに使うことはできないと思います。

したがって、私はデフォルトでstdoutを使用してファイルに切り替えることができますが、書式設定されたデータには "<"演算子を使用して同様のものを考え出しています。

たぶん、その後myOutput << "Hello" << 1 << 1.5;を行うためのアイデアと

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

の線に沿って何か。しかし、上記の行でコンパイラは不平を言う。

正しい方法は何ですか?

ありがとうございます!

+3

私の知る限りの流れは本当に単純な答えにつながる –

+3

乾杯アーメンコピー可能ではありません。 'std :: ostream&myOutput(std :: cout);' – Cookie

答えて

1

あなたはずっとFILE*バージョンのようstd::ostreamへのポインタを使用することができます。

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

私はあなたが探しているものを正しく理解しているかどうかはわかりません。しかし、この1つはあなたを助けることができるかのように思える:

#include <sstream> 

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

使用法:

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

は(あなたは、あなたが好きな出力機能を養うことができます)のstd ::文字列を生成します。

精巧な説明と解説:http://dev.rootdirectory.de/trac.fcgi/wiki/SSTR%28%29

1

簡単な答え、本当に

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

おかげ

関連する問題