Там нет встроенной функции, чтобы делать именно то, что вы хотите, но есть несколько вариантов.
Вариант 1: чтение данных кусками. Вы не знаете точно, где находятся ваши данные, поэтому читайте по несколько килобайт данных за раз и ищите в этих порциях. Убедитесь, что вы имеете дело со случаем, когда искомая строка пересекает границу фрагмента! Как только вы нашли строку, используйте fseek()
, чтобы позиционировать себя в начале.
Вариант два: сопоставьте память файла и используйте memmem()
для всего файла (как сопоставлено с памятью). Это требует непереносимых вызовов для настройки отображения памяти, поэтому вам нужно знать свою ОС (или использовать библиотеку оболочки переносимости, такую как glib ). На 32-разрядных компьютерах он также ограничивает размер файлов, в которых вы можете искать, до нескольких сотен мегабайт. Это, однако, очень простой и эффективный подход, когда это возможно.
Если вы выберете первый вариант, самая сложная часть будет касаться случая разбиения на порции. Один из вариантов - всегда хранить в памяти два блока и перезапустить поиск, чтобы он начинался (length of target string) - 1
байт до конца предыдущего блока. Фактический поиск может быть выполнен с использованием memmem()
или любого другого алгоритма поиска строки . Вы также можете конвертировать результаты поиска в DFA (поскольку это обычный язык ) и сохранять текущее состояние по блокам.