あなたの質問は明確ではありませんが、多くの人がバッファの仕組みを誤解しているのを見てきましたので、私がお手伝いできると思います.
あなたが言っていることにより、データをバッファに読み込むことを期待しており、検索文字列と部分的に一致するのではないかと心配しています。その後、残りを読み取るときに、最初のデータ ロットを上書きします。
したがって、これはデータをどのように処理するかにかかっています。毎回メモリの同じ部分を読み込む必要はありません。バッファの要点は、必要に応じていっぱいにし、シャッフルしてから破棄できるスペースを提供することです。
バッファを効果的に使用する方法はたくさんあります。最も効率的ではないかもしれませんが、最も簡単に理解できるものを紹介します。
tail
バッファに読み込むとき、最後のバイトがどこにあるかがわかるように、インデックスを維持します (これを と呼びましょう)。バッファのサイズであるN
バイトまで読み取ることができます。N
データの処理に関しては、バイトまでチェックできますtail
。
すでに処理したものを追跡するには、head
インデックスを維持します。さらにデータを読み取る必要があると判断したら、 と の間のすべてを取得してhead
、tail
バッファーの先頭に移動します ( memmove
、NOT memcpy
を使用します)。head = 0
、および を設定しtail = tail-head
ます。N - tail
これで、より多くのバイトを読み取ることができます。当然、tail
インデックスの後から始まるバッファ内の位置に読み込みます。
一致文字列全体を連続したバイトとしてテストできるようにする場合は、これが最も簡単なバッファリング アプローチです。
さらに一歩進んだ場合、データをまったく移動する必要がないことを理解するのに多くの想像力は必要ありません。あちこちhead
追いかけるだけです。tail
これは、リング(または循環) バッファーと呼ばれます。これの難しさは、通常の文字列マッチングを使用できないことですが、独自の文字列を作成するのにそれほど時間はかかりません。
これが役に立てば幸いです。