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

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

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

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

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

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

谢谢。

【问题讨论】:

    标签: c++ string stream std


    【解决方案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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多