@seheには、EOFを停止したり、特定のバイト数を読み込んだりすることができます。私のバージョンは少し複雑ですが、さらに区切り文字を使用することもできます。
あなたの後押しをconstructでき:: ASIO ::最大サイズ引数を指定したstreambuf:
basic_streambufのコンストラクタは、入力のサイズの合計の最大値を指定するsize_tの引数を受け取りシーケンスと出力シーケンス。 basic_streambufオブジェクトの有効期間中は、以下の不変成り立つ:
size() <= max_size()
成功した場合には、不変に違反することが原因となる任意のメンバ関数は、クラスのstdの例外をスローするもの:: length_errorを。
それとも、このオーバーロードを使用することができます。
template<
typename SyncReadStream,
typename Allocator,
typename MatchCondition>
std::size_t read_until(
SyncReadStream & s,
boost::asio::basic_streambuf<Allocator> & b,
MatchCondition match_condition,
boost::system::error_code & ec,
typename enable_if< is_match_condition<MatchCondition>::value >::type * = 0);
一致条件機能は多少のようになります。ここで
using iterator = buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>;
/**
\brief Make read_until stop when either:
* the stop character was found
* more than 100MB have been read
*/
pair<iterator, bool> match_condition(iterator begin, iterator end) {
// to much data?
if(end - begin > 100*1024*1024) {
return std::make_pair(begin, true);
}
// try and find stop character
for(auto i = begin; i < end; i++) {
auto c = i.rdbuf()->sgetc();
if(c == STOP_CHARACTER) {
return std::make_pair(i, true);
}
}
return std::make_pair(begin, false);
}
(複数文字の区切り文字で、この作品を作ることは、次のように残っています読者のための練習)
これは素晴らしいですが、実際は複雑すぎる、IYAM(私の答えを見てください) – sehe
@あなたが正しいです、少し編集しました。私は "\ r \ n"を確認するためにそれを使用したので、OPは実際の文字 '<'、 'E'、 'O'、 'F'、 '>'を意味し、それを心に念頭に置いて答えを書きました – user45891
実際これは、質問を読むための有効な方法です。その場合、これは最善の答えです。+1 – sehe