【发布时间】:2012-12-04 13:15:19
【问题描述】:
我需要一些指导或指针来了解如何实现自定义 ostream。我的要求是:
- 一个带有“
- 目的是将输出发送到数据库。每条“行”都应该有一个单独的记录。
- 每条记录最重要的字段是文本(或blob),但其他一些字段,如时间等,大多可以自动推导出来
- 缓冲很重要,因为我不想为每条记录都去数据库。
首先,是否值得从 ostream 派生?我从 ostream 派生得到什么?如果我的类只实现了几个operator<< 方法(包括一些自定义数据类型)怎么办。我可以从 ostream 获得哪些功能?
假设我想要的是一个从 ostream 派生的类,我需要一些指导来理解 ostream 和 streambuf 类之间的关系。我需要实施哪一项?查看一些示例,似乎我根本不需要从 ostream 派生,只需给 ostream 构造函数一个自定义的 streambuf。真的吗?这是规范的方法吗?
我需要在自定义 streambuf 中实现哪些虚函数?我看过一些示例(包括这个站点:here 和 here,等等),一些覆盖了 sync 方法,还有一些覆盖了 overflow 方法。我应该覆盖哪一个?此外,查看 stringbuf 和 filebuf 源(Visual Studio 或 GCC),这两个缓冲区类都实现了 streambuf 的许多方法。
如果需要从 streambuf 派生的自定义类,那么从 stringbuf(或任何其他类)而不是直接从 streambuf 派生是否有任何好处?
至于“线”。我希望至少当我的班级用户使用“endl”操纵器成为一个新行(即数据库中的记录)时。也许 - 取决于努力 - 每个 '\n' 字符也应该被视为一个新记录。我的自定义 ostream 和/或 streambuf 会分别通知谁?
【问题讨论】:
-
您可能应该创建自己的
streambuf类来处理所有繁重的工作,然后创建一个非常简单的ostream类,它继承std::basic_ostream并使用您的streambuf对象进行初始化. -
您应该查看Boost.Iostreams - 它使创建自定义流和缓冲区变得更加简单。
-
感谢您的编辑,@MarkusParker
标签: c++