Это очень просто. Вы считаете самый длинный шаблон, который вы будете искать, затем либо отскакиваете указатель файла на эту сумму, либо прокручиваете файл, читая только дельту.
Представьте, что самый длинный шаблон составляет 26 байт.
- Прочитано 1к.
- Проверьте все рисунки -> ничего.
- Капля 1k - 26 байт из буфера.
- Читать 1k - 26 байт из потока и добавить в буфер
- Goto 2.
Edit: Позвольте мне уточнить: Есть два способа сделать это, оба имеют свои достоинства. Тот, который я документировал выше, лучше всего использовать, если вы читаете из потока, что означает источник данных, который не поддерживает поиск. Если, однако, ваш источник данных поддерживает поиск (например, файл файловой системы), вы можете легко сделать то же самое с запросами. Проверьте шаблон, если он не найден, найдите размер самого длинного шаблона, затем начните с него.
Если, однако, вы хотите поддержать поиск шаблонов, длина которых превышает размер вашего буфера, вам может потребоваться гораздо более умный алгоритм. Вам понадобится таблица поиска всех шаблонов, которые в настоящее время «открываются», когда вы пытаетесь прочитать больше данных, что, в свою очередь, будет стоить больше памяти - вы получите эту проблему.
Надеюсь, что его длина самой длинной строки не 1k-1 :) –
Хорошая идея, но она работает только, если он ищет точные символы. Что, если шаблон - все между некоторыми тегами html. Это длина непредсказуема. –
Если длина непредсказуема, я, конечно, предсказываю длину, большую, чем его размер буфера. Это означает, что у него больше проблем, чем он знает :) – 0xCAFEBABE