我有一个unsigned char *buffer
充满size
字节的缓冲区。我想从中初始化一个流。
我可以这样做,它复制缓冲区字节:
string s(bytes, bytes + size);
stringstream ss(s);
我想知道我是否可以在没有该副本的情况下启动流?
您需要实现一个自定义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;
}