我有一个固定长度的字符缓冲区,我想将它提供给一个带有std :: istream&的函数.如何在不复制缓冲区的情况下执行此操作?
如果这意味着派生出一个自定义的streambuf,我想我会接受这个副本.我只是想知道我是否错过了一些直截了当的东西.
这就是我现在正在做的事情(这是不需要的副本):
void loadFromBuffer(const char* buff, size_t len) {
std::istringstream is(std::string(buff, len)); // BUFFER COPIED HERE :(
load(is);
}
Run Code Online (Sandbox Code Playgroud)
编辑:
为了记录,这是使用boost.Iostreams的简单解决方案:
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/stream.hpp>
void loadFromBuffer2(char* buff, size_t len) {
typedef boost::iostreams::stream<boost::iostreams::array_source> array_stream;
array_stream is(buff, len);
load(is);
}
Run Code Online (Sandbox Code Playgroud)
我接受了Boost.Iostreams的答案,因为它似乎是"正确的"解决方案,但它不能在我的平台(Android NDK)上编译,所以我最终使用了弃用的std :: istrstream解决方案.感谢大家.
我自己一直处于类似的情况,而不是自己创建一切我使用Boost.Iostreams,创建一个只读源设备.
未经测试,但这可能有效:
class ConstBufferDevice
{
public:
typedef char char_type;
struct category :
virtual boost::iostreams::device_tag,
virtual boost::iostreams::input_seekable
{
};
ConstBufferDevice(const char_type* buffer, size_t buffersize)
: buffer_(buffer)
, buffersize_(buffersize)
, pos_(0)
{
}
std::streamsize read(char_type* buffer, std::streamsize buffersize)
{
const std::streamsize amount = static_cast<std::streamsize>(buffersize_ - pos_);
const std::streamsize result = (std::min)(buffersize, amount);
if (result != 0)
{
std::copy(buffer_ + pos_, buffer_ + pos_ + result, buffer);
pos_ += result;
return result;
}
else
{
return buffersize ? -1 : 0; // EOF
}
}
std::streampos seek(boost::iostreams::stream_offset offset,
std::ios_base::seekdir seekdir)
{
// Determine new value of pos_
boost::iostreams::stream_offset newpos;
if (seekdir == std::ios_base::beg)
{
newpos = offset;
}
else if (seekdir == std::ios_base::cur)
{
newpos = pos_ + offset;
}
else if (seekdir == std::ios_base::end)
{
newpos = buffersize_ + offset;
}
else
{
throw std::ios_base::failure("bad seek direction");
}
// Check for errors
if (newpos < 0 || newpos > buffersize_)
{
throw std::ios_base::failure("bad seek offset");
}
pos_ = static_cast<size_t>(newpos);
return boost::iostreams::offset_to_position(newpos);
}
private:
const char_type* buffer_;
size_t buffersize_;
size_t pos_;
};
typedef boost::iostreams::stream<ConstBufferDevice> ConstBufferStream;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4219 次 |
| 最近记录: |