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

7

我有一个函数,它可以使用 std::ostream。我需要支持使用一个 C 文件句柄 (FILE*)。我应该创建一个 自己的子类 来代理一个 FILE* 吗?


如果你想要疯狂地改回去,就请随意。关于用类包装东西,或者FILE* 与C分别继承和规范化,这些都不是C问题。正如Stackoverflow用户经常指出的那样,C不是C++的子集。 - Matt Joiner
请查看 streambuf 的这个子类,它包装了 FILE*。链接在此:http://ilab.usc.edu/rjpeters/groovx/classrutz_1_1stdiobuf.html - Keith Pinson
@Kazark:太棒了...如果你把那个作为答案发表,我会接受它 :) - Akusete
请注意,这与以下问题有关:https://dev59.com/0HE85IYBdhLWcg3wgDpI。 - Hugues
2个回答

8
正如Ben Voigt所指出的那样,您需要创建一个streambuf子类。南加州大学网站上有一个GNU实现streambuf子类(stdiobuf)的文档头文件源文件, 该子类包装了一个FILE*。它在库的某些依赖性上(GroovX)但应该很容易移除(我会先删除所有对GVX_TRACE的引用)。
有趣的是,尽管Ben Voigt说过,它还提供了一个最小化的std::iostream子类(stdiostream)。但这似乎并不必要,因为stdiostream类使用rdbuf("read buffer"/set the stream buffer)方法将stdiobuf类连接到流对象,该方法是公开可访问的。
您可以在此处了解更多关于子类化streambuf(特别是查看页面底部讨论虚拟函数)。上面链接的实现覆盖了syncunderflow(以支持输入)和overflow(以支持输出)。
关于上面链接实现的进一步说明:

6
不,ostream并不是用来派生的。iostreams库允许定制的方式是在创建ostream时提供一个streambuf指针。 streambuf有很多虚函数,因此可以更改其行为。
你需要直接从streambuf或现有的filebuf子类中派生。 你可能只需要提供overflow函数,其他所有默认值都应该正常工作。

哇,那听起来还算比较干净。 - R.. GitHub STOP HELPING ICE
iostreams旨在可扩展。大约一周前,我编写了一个stingbuf,允许将写入cout的数据显示在UI文本框中,当没有控制台窗口附加时(只是覆盖了sync),还编写了一个输入streambuf子类,使用内存映射文件,处理文本文件的速度比我之前用于文本文件处理的ifstream+getline+istringstream快20-30倍。标准streambuf实现的效率非常低下,因为它们试图适应每种可能的情况,这真是令人惊讶。 - Ben Voigt
1
实际上,从ostream派生是完全可以的,例如ofstream。然而,这样的派生类只是提供了一个方便的构造函数,调用了ostream::ostream(streambuf*) - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接