Sim*_*ter 30
您将定义一个streambuf子类包装vector,并将其实例传递给istream构造函数.
如果数据在构造后没有改变,则使用设置数据指针就足够了streambuf::setg(); 其他成员的默认实现是正确的:
template<typename CharT, typename TraitsT = std::char_traits<CharT> >
class vectorwrapbuf : public std::basic_streambuf<CharT, TraitsT> {
public:
vectorwrapbuf(std::vector<CharT> &vec) {
setg(vec.data(), vec.data(), vec.data() + vec.size());
}
};
std::vector<char> data;
// ...
vectorwrapbuf<char> databuf(data)
std::istream is(&databuf);
Run Code Online (Sandbox Code Playgroud)
如果您需要更高级的东西,请覆盖该streambuf::underflow方法.
Zun*_*Tzu 14
使用Boost:
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/device/array.hpp>
using namespace boost::iostreams;
basic_array_source<char> input_source(&my_vector[0], my_vector.size());
stream<basic_array_source<char> > input_stream(input_source);
Run Code Online (Sandbox Code Playgroud)
甚至更简单:
#include <boost/interprocess/streams/bufferstream.hpp>
using namespace boost::interprocess;
bufferstream input_stream(&my_vector[0], my_vector.size());
Run Code Online (Sandbox Code Playgroud)
调整来自char*的获取istream的答案,并假设这是你正在尝试做的事情:
// Forward declarations
std::vector<char> my_create_buffer();
void my_consume_buffer( std::istream & is );
// What you want to be able to write
std::vector<char> buffer = my_create_buffer();
my_consume_buffer( wrap_vector_as_istream(buffer) );
Run Code Online (Sandbox Code Playgroud)
然后你可以创建wrap_vector_as_istream这样的(虽然未经测试):
#include <iostream>
#include <istream>
#include <streambuf>
#include <string>
struct wrap_vector_as_istream : std::streambuf
{
wrap_vector_as_istream(std::vector<char> & vec ) {
this->setg(&vec[0], &vec[0], &vec[0]+vec.size() );
}
};
Run Code Online (Sandbox Code Playgroud)
但要注意一件事.您创建的对象包含指向向量内存的指针.因此,如果您在将此包装器浮动时向向量添加或移除值,那么您将前往崩溃.
(哦,如果你投票给我,请投票我已经改编了这个帖子.)
| 归档时间: |
|
| 查看次数: |
11813 次 |
| 最近记录: |