gpt4 book ai didi

c++ - 为 streambuf boost ASIO ForwardIterator

转载 作者:行者123 更新时间:2023-11-30 02:27:17 24 4
gpt4 key购买 nike

我正在使用 boost::asio::async_read_until 从 TCP 套接字读取 \n 结束的行。让我记忆一下 async_read_until 签名如下:

http://www.boost.org/doc/libs/1_63_0/doc/html/boost_asio/reference.html#boost_asio.reference.async_read_until

void-or-deduced async_read_until(
AsyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
char delim,
ReadHandler handler);

这里

boost::asio::streambuf b;

是自动调整大小的对象来存储接收到的数据。

据我了解,它在内部由缓冲区序列组成,一个 boost::asio 缓冲区列表。但是,没有简单的方法来获取 ForwardIterator 来迭代这个由多个连续区域组成的内部缓冲区。

我发现了以下使用模式:

std::istream stream(&b);
std::istream_iterator<char> end;
std::istream_iterator<char> begin(stream);

但是,这里的endbegin 是InputIterators。

同时,boost::spirit::phrase_parse(begin, end, grammar, space, obj) 解析器可以解析从socked获取的行要求 beginend 为 ForwardIterators:

http://www.boost.org/doc/libs/1_63_0/libs/spirit/doc/html/spirit/support/multi_pass.html

这是回溯所必需的。然而,数据实际上已经存储在 boost::asio::streambuf b 对象的内存缓冲区中,没有什么能阻止迭代器被多次取消引用。

最佳答案

Boost 具有 buffers_begin()buffers_end(),您可以在 streambufdata():

Live On Coliru

#include <boost/asio.hpp>
#include <boost/spirit/include/qi.hpp>

namespace a = boost::asio;
namespace qi = boost::spirit::qi;

#include <iostream>
int main()
{
a::streambuf input;
std::ostream(&input) << "123, 4, 5; 78, 8, 9;\n888, 8, 8;";

auto f = a::buffers_begin(input.data()), l = a::buffers_end(input.data());
//std::copy(f, l, std::ostream_iterator<char>(std::cout));

std::vector<std::vector<int> > parsed;
bool ok = qi::phrase_parse(f, l, *(qi::int_ % ',' >> ';'), qi::space, parsed);

if (ok) {
std::cout << "parsed: \n";
for (auto& row : parsed) {
for (auto& v : row) { std::cout << v << " "; }
std::cout << ";\n";
}
}
else
std::cout << "parse failed\n";

if (f!=l)
std::cout << "remaining unparsed input: '" << std::string(f,l) << "'\n";
}

打印(如预期):

parsed: 
123 4 5 ;
78 8 9 ;
888 8 8 ;

注意不要忘记consume()输入的解析部分!

关于c++ - 为 streambuf boost ASIO ForwardIterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41878568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com