我有一个函数,它可以使用 std::ostream
。我需要支持使用一个 C 文件句柄 (FILE*
)。我应该创建一个 自己的子类 来代理一个 FILE*
吗?
streambuf
子类。南加州大学网站上有一个GNU实现streambuf
子类(stdiobuf
)的文档、头文件和源文件, 该子类包装了一个FILE*
。它在库的某些依赖性上(GroovX)但应该很容易移除(我会先删除所有对GVX_TRACE
的引用)。std::iostream
子类(stdiostream
)。但这似乎并不必要,因为stdiostream
类使用rdbuf("read buffer"/set the stream buffer)方法将stdiobuf
类连接到流对象,该方法是公开可访问的。streambuf
(特别是查看页面底部讨论虚拟函数)。上面链接的实现覆盖了sync
、underflow
(以支持输入)和overflow
(以支持输出)。init
方法使用 setg
和 setp
方法来设置输入和输出序列的指针。const int num = pptr()-pbase();
通过从 基本输出指针(base output pointer) 减去 当前输出指针(put pointer) 来计算要刷新的字符数。om
的变量是模式参数。fd
的变量是文件描述符。ostream
并不是用来派生的。iostreams库允许定制的方式是在创建ostream
时提供一个streambuf
指针。 streambuf
有很多虚函数,因此可以更改其行为。streambuf
或现有的filebuf
子类中派生。 你可能只需要提供overflow
函数,其他所有默认值都应该正常工作。stingbuf
,允许将写入cout
的数据显示在UI文本框中,当没有控制台窗口附加时(只是覆盖了sync
),还编写了一个输入streambuf
子类,使用内存映射文件,处理文本文件的速度比我之前用于文本文件处理的ifstream
+getline
+istringstream
快20-30倍。标准streambuf实现的效率非常低下,因为它们试图适应每种可能的情况,这真是令人惊讶。 - Ben Voigtostream
派生是完全可以的,例如ofstream
。然而,这样的派生类只是提供了一个方便的构造函数,调用了ostream::ostream(streambuf*)
。 - MSalters
streambuf
的这个子类,它包装了FILE*
。链接在此:http://ilab.usc.edu/rjpeters/groovx/classrutz_1_1stdiobuf.html - Keith Pinson