Как вы читаете файл, пока не нажмете определенную строку в c? - PullRequest
1 голос
/ 20 февраля 2011

Я хотел знать, как в C вы можете читать определенный файл, пока чтение не достигнет определенной строки или массива символов.То, что я хочу сделать, это то, что как только файл попадет в эту строку, я хочу, чтобы позиция была установлена ​​в этой точке.Я собираюсь использовать fseek для этого, и это не проблема.Это просто чтение, пока не нажата определенная строка, которую я не могу сделать.Я читал о некоторых функциях, но, похоже, нет ничего, что могло бы с этим справиться.Fgets - самая близкая вещь к этому, но я не хочу предоставлять определенное количество символов для чтения, так как я не знаю, сколько.Но можете ли вы дать мне несколько советов, как это сделать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Существует множество эффективных алгоритмов поиска строк, каждый из которых может быть реализован на языке C.

http://en.wikipedia.org/wiki/String_searching_algorithm

Если вы ищете строку длины N, проще всего сохранить циклический буфер длины N и прочитать 1 байт за раз из файла, добавив его в циклический буфер. На каждом шаге вы сравниваете свой буфер со строкой, которую вы ищете. Это крайне неэффективно, но легко кодируется.

0 голосов
/ 20 февраля 2011

Там нет встроенной функции, чтобы делать именно то, что вы хотите, но есть несколько вариантов.

Вариант 1: чтение данных кусками. Вы не знаете точно, где находятся ваши данные, поэтому читайте по несколько килобайт данных за раз и ищите в этих порциях. Убедитесь, что вы имеете дело со случаем, когда искомая строка пересекает границу фрагмента! Как только вы нашли строку, используйте fseek(), чтобы позиционировать себя в начале.

Вариант два: сопоставьте память файла и используйте memmem() для всего файла (как сопоставлено с памятью). Это требует непереносимых вызовов для настройки отображения памяти, поэтому вам нужно знать свою ОС (или использовать библиотеку оболочки переносимости, такую ​​как glib ). На 32-разрядных компьютерах он также ограничивает размер файлов, в которых вы можете искать, до нескольких сотен мегабайт. Это, однако, очень простой и эффективный подход, когда это возможно.

Если вы выберете первый вариант, самая сложная часть будет касаться случая разбиения на порции. Один из вариантов - всегда хранить в памяти два блока и перезапустить поиск, чтобы он начинался (length of target string) - 1 байт до конца предыдущего блока. Фактический поиск может быть выполнен с использованием memmem() или любого другого алгоритма поиска строки . Вы также можете конвертировать результаты поиска в DFA (поскольку это обычный язык ) и сохранять текущее состояние по блокам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...