【问题标题】:Customized "ofstream" output定制的“ofstream”输出
【发布时间】:2012-12-20 16:17:27
【问题描述】:

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

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

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

【问题讨论】:

  • 我建议简单地环绕 std::ofstream。这意味着您将使用 std::ofstream 成员创建一个类。
  • 在之前阅读该主题时,我发现现在已删除答案:stackoverflow.com/questions/4366904/… !!!

标签: c++ inheritance logging filestream filebuf


【解决方案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() 是您可以插入的示例(您可以创建一个沼泽标准两个参数运算符

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

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

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

警告 2012-01-03 19:32 failedFunction("argument value"): 无法做某事。

除此之外,您还需要一种设置严重性的方法,它可以像在您添加模板化运算符http://www.math.hkbu.edu.hk/parallel/pgi/doc/pgC++_lib/stdlibug/man_6665.htm 了解有关编写操纵器的入门知识。

【讨论】:

  • 嗨,我正在使用您的模板扩展 myy 记录器类,但是当我链接应用程序时出现类似这样的错误:"error LNK2001: unresolved external symbol "public: class std::basic_ostream&lt;char,struct std::char_traits&lt;char&gt; &gt; &amp; __thiscall Logger::operator&lt;&lt;&lt;char const [35]&gt;(char const (&amp;)[35])" (??$?6$$BY0CD@$$CBD@Logger@@QAEAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAY0CD@$$CBD@Z) ...\DependencyResource.obj"您能再帮我一次吗?谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-04
  • 1970-01-01
  • 2013-07-01
相关资源
最近更新 更多