CodeWalk

自定义流缓冲区(streambuf)实现

作者:编译有声 · 2026-05-30 12:55

请解释如何通过继承 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 抽象,直接组合各类流变换。