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++ - 实现我自己的流的主要内容,如果未能解决你的问题,请参考以下文章