ASIO ::ストリームバッファへの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);
}
に持つまではistream
として(ASIO_STANDALONE付き)ASIO ::ソケットから読み出されたデータを使用する必要が
を破棄
私が直面している問題は、read_until
によって破棄されないので、'\n'
がistreamの最後に表示されることです。
宣言は
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私は次の質問が精神との効率的な構文解析であると感じています。 –