C'est facile. Vous comptez le motif le plus long que vous rechercherez, puis revenez en arrière sur le pointeur de fichier d'une certaine quantité, ou vous faites défiler le fichier, en ne lisant que le delta. Imaginez que le motif le plus long soit 26 octets.
- Lecture de 1k.
- Vérifiez tous les motifs -> rien.
- Supprime 1k - 26 octets du tampon.
- Lire 1k - 26 octets de flux et ajouter à votre tampon
- Aller à 2.
Edit: Permettez-moi de préciser: Il existe deux méthodes pour ce faire, les deux ont leurs mérites. Celui que j'ai documenté ci-dessus est mieux utilisé si vous lisez un flux, ce qui signifie une source de données qui ne supporte pas la recherche. Si, toutefois, votre source de données supporte la recherche (comme un fichier de système de fichiers), vous pouvez facilement faire la même chose avec seek. Vérifiez le motif, s'il n'est pas trouvé, recherchez la taille de votre motif le plus long, puis recommencez à partir de là. Toutefois, si vous souhaitez prendre en charge la recherche de motifs plus longs que la taille de votre tampon, vous aurez peut-être besoin d'un algorithme beaucoup plus intelligent. Vous auriez besoin d'une table de recherche de tous les modèles qui sont actuellement "ouverts" lorsque vous contnuez de lire plus de données, ce qui à son tour vous coûtera plus de mémoire - vous obtenez le problème.
Espérons juste que sa longueur de la plus longue chaîne n'est pas 1k-1 :) –
Bonne idée, mais cela ne fonctionne que s'il recherche des caractères exacts. Que faire si le modèle - tout entre quelques balises html. Sa longueur est imprévisible. –
Si la longueur est imprévisible, bien sûr je prédis une longueur plus grande que sa taille de tampon. Ce qui signifie qu'il a plus de problèmes qu'il ne le sait :) – 0xCAFEBABE