我有一个填充unsigned char *buffer
字节的缓冲区size
。我想从中创建一个流。
我可以按照以下方式执行操作,它会复制缓冲区字节:
string s(bytes, bytes + size);
stringstream ss(s);
我想知道我是否可以在没有该副本的情况下启动流?
答案 0 :(得分:3)
您需要实现自定义streambuf
,然后将其传递给istream
构造函数。这将允许您像任何其他流一样访问阵列数据。有关详细信息,请参阅以下链接:
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;
}