C++ - 实现我自己的流

Posted

技术标签:

【中文标题】C++ - 实现我自己的流【英文标题】:C++ - Implementing my own stream 【发布时间】:2011-02-28 12:09:21 【问题描述】:

你好!我的问题可以这样描述:

我有一些数据实际上是一个数组,可以表示为 char* data 和一些 size

我还有一些遗留代码(函数),它们将一些抽象的std::istream 对象作为参数并使用该流来检索数据以进行操作。

所以,我的问题如下 - 将我的 data 映射到某个 std::istream 对象以便我可以将它传递给我的函数的简单方法是什么?我想过从我的data 创建一个std::stringstream 对象,但这意味着复制并且(我认为)不是最好的解决方案。

有什么想法可以让我的std::istream 直接在data 上运行吗?

谢谢。

【问题讨论】:

【参考方案1】:

如果您正在考虑实际创建自己的流,我会查看 Boost.iostreams 库。它使您可以轻松创建自己的流对象。

【讨论】:

而且,IIRC 已经有了从 std::vector 或数组中拉出东西的粘合剂。【参考方案2】:

绝对不是最简单的方法,但以防万一有人想了解 std 流在内部是如何工作的,这似乎是关于如何滚动自己的一个很好的介绍:

http://www.mr-edd.co.uk/blog/beginners_guide_streambuf

【讨论】:

【参考方案3】:

使用字符串流:

#include <sstream>

int main()

    char[]  data = "PLOP PLOP PLOP";
    int     size = 13;  // PS I know this is not the same as strlen(data);

    std::stringstream  stream(std::string(data, size));

    // use stream as an istream;

如果您想真正高效,可以直接使用流缓冲区。我没有尝试过,也没有编译器可以测试,但以下应该可以工作:

#include <sstream>

int main()

    char[]  data = "PLOP PLOP PLOP";
    int     size = 13;  // PS I know this is not the same as strlen(data);

    std::stringstream  stream;
    stream.rdbuf()->pubsetbuf(data, size);

    // use stream as an istream;

【讨论】:

以上是关于C++ - 实现我自己的流的主要内容,如果未能解决你的问题,请参考以下文章

什么是 C++ 中的流?

c++,在自己定义的函数中去修改vector变量中的内容,要怎么实现?

02 | 自己动手,实现C++的智能指针

C++自己实现一个String类

自己用C++写的图像处理软件试用版下载

如何使用 C++ 中的流从文件末尾读取给定数量的行?