Boost ASIO ForwardIterator for streambuf
Boost ASIO ForwardIterator for streambuf
我正在使用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);
然而,这里end
和begin
是InputIterator。
同时,可以用来解析从插入行获得的boost::spirit::phrase_parse(begin, end, grammar, space, obj)
解析器需要begin
和end
是ForwardIterator:
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()
,可以在streambuf
的data()
:上使用
在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 failedn";
if (f!=l)
std::cout << "remaining unparsed input: '" << std::string(f,l) << "'n";
}
打印(如预期):
parsed:
123 4 5 ;
78 8 9 ;
888 8 8 ;
注意不要忘记consume()
输入的解析部分!
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- 在Linux for Windows上编译C++代码时出错
- 调用专用模板时出错"no matching function for call to [...]"
- 为什么我的for循环不能正确获取argv
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- std::memory_order for std::atomic:<T>:wait
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- Boost ASIO ForwardIterator for streambuf