自定义流缓冲区(streambuf)实现
请解释如何通过继承 std::streambuf 创建自定义流缓冲区,实现如内存映射文件流、网络流、压缩流等自定义 I/O 设备。给出一个简单的内存流示例。
回答
编译有声
std::streambuf 是 C++ I/O 的核心底层接口,通过继承它可实现自定义 I/O。
关键虚函数:
underflow():读缓冲区为空时从源加载数据。overflow(int c):写缓冲区满时将数据写入目标。sync():刷新写缓冲区。seekoff/seekpos:定位。setg/setp:管理 get/put 缓冲区指针。
简单内存流示例:
class MemoryBuf : public std::streambuf {
public:
MemoryBuf(const char* data, size_t size) {
char* p = const_cast<char*>(data);
setg(p, p, p + size); // 设置 get 缓冲区
}
};
class MemoryStream : public std::istream {
public:
MemoryStream(const char* data, size_t size)
: std::istream(&buf_), buf_(data, size) {}
private:
MemoryBuf buf_;
};
// 使用
MemoryStream ms("42 3.14", 7);
int i; double d;
ms >> i >> d;
应用场景:
- 内存映射文件流(mmap + streambuf)。
- Gzip 压缩流(数据写入时压缩,读取时解压)。
- 网络 socket 流(boost::asio 的 streambuf)。
boost.iostreams 提供更便捷的 Filter/Device 抽象,直接组合各类流变换。