定制的“ofstream”输出

时间:2012-12-20 16:17:28

标签: c++ inheritance logging filestream filebuf

我必须扩展ofstream类来编写日志流服务。

目标是拦截每一行,在每一行的头部添加一个自定义文本(日期/时间,严重性等)。

现在,很明显我不是C ++专家,所以我阅读了很多关于这个任务的文档,例如:

http://www.angelikalanger.com/Articles/Topics.html#CPP http://asmodehn.wordpress.com/2010/06/20/busy-c-coding-and-testing
http://gabisoft.free.fr/articles-en.html

以上文章建议编写自定义流缓冲区,但在文件流中移植此概念时遇到了很多困难。

是否有更简单的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

您不需要编写自定义流缓冲区;最简单和最直接的方法是通过给它一个模板化的单个参数运算符<<()来创建一个可以发送输出的类:

template <typename T>
std::ostream& operator<<(const T& data_)
{
    m_outstream << m_severity << "\t" << getTimeStamp() << "\t" << data_;

    return m_outstream;
}

其中m_outstream是某种类型的std :: ostream(std :: ofstream等)。 m_severity和getTimeStamp()是您可以插入的示例(您可以创建一个bog标准的两个参数运算符&lt;&lt;()来格式化并将严重性类型输出到ostream)。

然后,您可以执行以下操作:

myLogger << "failingFunction(" << argument <<
            "): Could not do something." << std::endl;

你将获得m_outstream上的输出,如下所示:

  

警告2012-01-03 19:32 failingFunction(“参数值”):无法做某事。

除此之外,您还需要一种方法来设置严重性,这可以像在您添加了模板化运算符&lt;&lt;()的记录器类上调用的方法一样简单。如果你想变得非常花哨,你可以编写自己的操纵器,就像std :: ostream上的setw()一样。有关编写操纵器的入门知识,请参阅http://www.math.hkbu.edu.hk/parallel/pgi/doc/pgC++_lib/stdlibug/man_6665.htm