我有一个与std::ostream
一起使用的功能。我需要支持使用 C文件句柄(FILE*
)。我应该创建{em>我自己的std::ostream
的子类,它委托给FILE*
吗?
答案 0 :(得分:6)
不,ostream
并非来自。{ iostreams库允许自定义的方式是在创建streambuf
时提供ostream
指针。 streambuf
有许多虚函数,因此您可以更改其行为。
您需要直接从streambuf
或现有的filebuf
子类派生。您可能只需要提供overflow
函数,其他所有函数的默认值都可以正常工作。
答案 1 :(得分:6)
正如Ben Voigt指出的那样,你想要继承streambuf
。南加州大学网站上有一些页面documentation,header和source,用于streambuf
子类(stdiobuf
)的GNU实现包裹FILE*
。它有一些依赖于它是(GroovX)的一部分的库,但是那些应该很容易删除(我将首先删除对GVX_TRACE
的所有引用)。
有趣的是,它提供了stdiostream
的简约子类(std::iostream
),尽管Ben Voigt说过。但这似乎没有必要,因为rdbuf(“读取缓冲区”/设置流缓冲区)方法stdiostream
类用于将stdiobuf
类连接到流对象可以公开访问。
您可以找到有关子类化streambuf
here的更多信息(特别请参阅讨论虚函数的页面底部)。上面链接的实现会覆盖sync
,underflow
(以支持输入)和overflow
(以支持输出)。
关于链接实施的进一步说明:
init
方法使用setg
和setp
方法设置输入和输出序列的指针。const int num = pptr()-pbase();
行通过从base output pointer(“放置指针”)中减去current output pointer来计算要刷新的字符数。om
的变量是模式参数。fd
的变量是文件描述符。