我需要使用从ASIO ::插座(带ASIO_STANDALONE)读取的数据作为一个IStreamASIO :: streambuf来的std :: istream的丢弃新行
到现在我有这样的代码
asio::error_code ec;
auto bytes_transferred = asio::read_until(socket, buffer, '\n', ec);
if(!ec)
{
buffer.commit(bytes_transferred);
std::istream line(&buffer);
// use line
buffer.consume(bytes_transferred);
}
我面临的问题是'\n'
出现在istream的末尾,因为它不会被read_until
丢弃。
的声明是
tcp::socket socket;
asio::streambuf buffer;
所以我需要构建流时忽略“\ n”字符。 我试着用
if(!ec)
{
// Ignore the last char ('\n')
std::string line = std::string(asio::buffers_begin(buffer),
asio::buffers_begin(buffer) + bytes_transferred - 1);
std::stringstream ss(line);
// use line
buffer.consume(bytes_transferred);
}
(正如我在这个问题efficient copy of data from boost::asio::streambuf to std::string看到的)但是,这会产生以下编译错误
In instantiation of ‘struct asio::detail::buffers_iterator_types<asio::basic_streambuf<>, char>’:
lib/asio/asio/buffers_iterator.hpp:77:46: required from ‘class asio::buffers_iterator<asio::basic_streambuf<>, char>’
file.h:58:78: required from here
lib/asio/asio/buffers_iterator.hpp:60:5: error: no type named ‘value_type’ in ‘class asio::basic_streambuf<>’
{
^
lib/asio/asio/buffers_iterator.hpp: In instantiation of ‘class asio::buffers_iterator<asio::basic_streambuf<>, char>’:
file.h:58:78: required from here
lib/asio/asio/buffers_iterator.hpp:455:43: error: no type named ‘const_iterator’ in ‘class asio::basic_streambuf<>’
typename BufferSequence::const_iterator begin_;
和其他几个人总是抱怨缺少的类型。 我对C++相当陌生,这个消息对我来说有点神秘,而且我不确定这是否是最好的方法,因为我将有相同数据的3个副本(在缓冲区中,在字符串中和流)
什么可能是我的问题可能的解决方案?
+1会与有关的IStream使用忽略空格样品额外的努力。荣誉提及真棒新颖''引用'当然:) :) – sehe
缓冲区保证以新行结束。我将使用istream来解析它,但部分验证是在解析结束时istream是空的(只有''和'\ t'被接受为尾随字符),所以我需要删除新队。 –
@sehe我有一种感觉,下一个问题将是关于高效的解析与精神......对你:) –