我可以从缓冲区初始化iostream而不复制它吗?

时间:2013-03-10 12:09:50

标签: c++ iostream

我有一个填充unsigned char *buffer字节的缓冲区size。我想从中创建一个流。

我可以按照以下方式执行操作,它会复制缓冲区字节:

string s(bytes, bytes + size);
stringstream ss(s);

我想知道我是否可以在没有该副本的情况下启动流?

1 个答案:

答案 0 :(得分:3)

您需要实现自定义streambuf,然后将其传递给istream构造函数。这将允许您像任何其他流一样访问阵列数据。有关详细信息,请参阅以下链接:

  1. std::streambuf
  2. std::istream
  3. Boost提供了iostreams库来帮助解决这个问题。特别是,它已经为包装标准数组提供了array_source类。以下代码示例说明了如何完成此操作:

    #include <cstdlib>
    #include <iostream>
    #include <string>
    
    #include <boost/iostreams/stream_buffer.hpp>
    #include <boost/iostreams/device/array.hpp>
    
    
    namespace io = boost::iostreams;
    
    int main(int argc, char* argv[]) {
        const char buffer[] = "buffer data\n";
    
        io::array_source src{ buffer, strlen(buffer) };
        io::stream_buffer<io::array_source> strbuf{ src };
    
        std::istream stream{ &strbuf };
        std::string line;
        std::getline(stream, line);
        std::cout << line << std::endl;
        return EXIT_SUCCESS;
    }