C++:使用istream包装vector <char>

Gab*_*iMe 25 c++

我想换一个vector<char>std::istream(所以读完载体将通过完成istream接口)

这样做的方法是什么?

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方法.

  • 使用gcc 4.7及更高版本,您需要使用this-> setg (2认同)

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)


Mic*_*son 5

调整来自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 次

最近记录:

8 年,3 月 前