C ++将格式化数据打印到std :: cout或文件(缓冲)

时间:2011-06-27 13:04:34

标签: c++ file logging

我一直在使用Petru's logging framework。这是他的代码的一部分:

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

这是非常好的,因为它只是在没有任何操作的情况下记录到stderr,但是随后可以将函数设置为包括stdout和文件在内的任何内容。但是,我认为这种方法不能用于格式化数据,因为需要使用fprintf。

因此,我试图想出一些类似的东西,让我们默认使用stdout并且可以切换到文件,但是使用“<<”格式化数据的运算符。

也许是

的内容
std::ostream myOutput(std::cout);

然后做myOutput << "Hello" << 1 << 1.5;的想法。然而,上面的行使编译器抱怨。

正确的方法是什么?

谢谢!

3 个答案:

答案 0 :(得分: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 :(得分:1)

简单回答,真的

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

由于

答案 2 :(得分: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