2015-04-22 2 views
1

Я пытаюсь создать программу, которая читает файл и ищет определенную комбинацию символов. Например: «/ start/4jy42jygsfsf/end /».Поиск комбинации символов в файле

Поэтому я хочу найти все «строки», начинающиеся с/start/и заканчивающиеся на/end /.

Для этого я использую функцию read(), потому что файл может быть двоичным (он не должен быть файлом с символами).

я вызвать функцию чтения() как то:

#define BUFFSIZE 4000 

// more declarations 

while (read(file_descriptor, buffer, BUFFSIZE) > 0) 
{ 
    //search for /start/ 
    //then search for /end/ 
    //build a string with all the chars between these two 
    //keep searching till you reach the end of buffer 
} 

Предположим, что каждая/запуска/сопровождается/конец /.

Возникает вопрос:

Как справиться с делами, что эта комбинация символов разрезают пополам?

Например, допустим, что первый раз прочитал() вызывается, в конце этого буфера I пятно /звезда и в следующий раз прочитать() вызывается в начале второго буфера есть t/4jy42jygsfsf/end/.

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

ответ

0

Когда вы дойдете до конца буфера, запишите состояние текущего частичного совпадения, если оно есть. Тогда, когда вы будете получать следующий буфер, у вас будет 4 обычных футляра:

  • Не внутри какого-либо текста, который будет соответствовать.
  • Пила только начало / в конце последнего буфера
  • В настоящее время внутри /start/. Другая переменная записывает, насколько вы соответствовали.
  • В настоящее время внутри /end/. Та же переменная, что и для /start /, показывает, насколько вы сравнены.

Ваши состояния внутри согласовани, как правило:

  1. В настоящее время ничего
  2. не соответствует Просто увидел / - следующий ищет «с» или «е».
  3. Соответствие либо start/, либо end/.
  4. Соответствует - /start или /end.

Основываясь на частичном совпадении, просто перейдите в правильное состояние в контролере.

ИЛИ

Вы можете использовать PCRE library. Он поддерживает частичное совпадение. Но, вероятно, это слишком много для ваших целей.

Смежные вопросы