使用自定义std :: ostream包装FILE *

时间:2010-11-11 05:05:43

标签: c++ wrapper iostream

我有一个与std::ostream一起使用的功能。我需要支持使用 C文件句柄FILE*)。我应该创建{em>我自己的std::ostream的子类,它委托给FILE*吗?

2 个答案:

答案 0 :(得分:6)

不,ostream并非来自。{ iostreams库允许自定义的方式是在创建streambuf时提供ostream指针。 streambuf有许多虚函数,因此您可以更改其行为。

您需要直接从streambuf或现有的filebuf子类派生。您可能只需要提供overflow函数,其他所有函数的默认值都可以正常工作。

答案 1 :(得分:6)

正如Ben Voigt指出的那样,你想要继承streambuf。南加州大学网站上有一些页面documentationheadersource,用于streambuf子类(stdiobuf)的GNU实现包裹FILE*。它有一些依赖于它是(GroovX)的一部分的库,但是那些应该很容易删除(我将首先删除对GVX_TRACE的所有引用)。

有趣的是,它提供了stdiostream的简约子类(std::iostream),尽管Ben Voigt说过。但这似乎没有必要,因为rdbuf(“读取缓冲区”/设置流缓冲区)方法stdiostream类用于将stdiobuf类连接到流对象可以公开访问。

您可以找到有关子类化streambuf here的更多信息(特别请参阅讨论虚函数的页面底部)。上面链接的实现会覆盖syncunderflow(以支持输入)和overflow(以支持输出)。

关于链接实施的进一步说明:

  • init方法使用setgsetp方法设置输入和输出序列的指针。
  • const int num = pptr()-pbase();行通过从base output pointer(“放置指针”)中减去current output pointer来计算要刷新的字符数。
  • 无效名为om的变量是模式参数。
  • 名为fd的变量是文件描述符。