2

我必须扩展 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

上面的文章建议编写一个自定义流缓冲区,但是在将这个概念移植到文件流上时,我遇到了很多困难。

有没有更简单的方法来实现这个目标?

4

1 回答 1

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() 是您可以插入的示例(您可以创建一个沼泽标准两个参数 operator<<() 来格式化严重性类型并将其输出到 ostream)。

然后,这允许您执行以下操作:

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

您将在 m_outstream 上获得如下输出:

警告 2012 年 1 月 3 日 19:32 失败函数(“参数值”):无法做某事。

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

于 2013-01-09T22:36:47.317 回答