LINUX.ORG.RU

Вопрос по регулярным выражениям и I/O в С++


0

0

Всем привет!

У меня есть задачка, но я не знаю, как лучше и правильнее её решить.
Может быть кто-нибудь наведёт на верные мысли.

Задача заключается в следующем:
Имеется некий файл, который содержит записи в определённом формате.
Есть необходимость последовательно вытаскивать из файла записи и 
обрабатывать их в программе.
Обычно записи - просто строки определённой длины.

Я хочу инкапсулировать все операции в классе, у которого 
предусмотреть метод GetRecord.

Проблема заключается в том, что хотелось бы иметь возможность 
обрабатывать файлы разного формата.
Т.е. строки могут разделяться \n или символом с кодом \002.
А может быть и ситуация, что определены последовательности начала
и конца записи (rec_begin, rec_end).

Сделать это хотелось бы следующим образом:
В конструктор класса передавать имя файла и строку с регулярным 
выражением, отвечающим шаблону записи.
Далее метод GetRecord будет просто последовательно получать записи
из ifstream'a и возвращать пользователю класса!

Т.е. должно получиться что-то вроде:
....
std::string reg_ex_1 = ...
std::string reg_ex_2 = ...
Source S1("file1.txt", reg_ex_1);
Source S2("file2.txt", reg_ex_2);
ProcessRecord1(S1.GetRecord());
ProcessRecord2(S2.GetRecord());
....

Вопрос: возможно ли реализовать подобное в C++
Причём данные хотелось бы читать непосредственно из ifstream, а не
наворачивать дополнительные буферы.
Программа должна работать по принципу
Пока есть записи
 {
   Чтение записи
   Обработка записи
 }
а не так:
Читаем все записи в буфер
Обрабатываем все записи

Файлы могут быть до 50Мб!





> Имеется некий файл, который содержит записи в определённом формате. Есть необходимость последовательно вытаскивать из файла записи и обрабатывать их в программе.

Присмотрись к программе-генератору синтаксических анализаторов lex (flex) Почитай вот это, например: http://student.math.msu.su/2course/Borisenko/lexyacc.txt

anonymous
()

> Вопрос: возможно ли реализовать подобное в C++

Ответ: да.

О чем еще, собственно, был вопрос, я так и не понял =)

int19h ★★★★
()
Ответ на: комментарий от Krivenok_Dmitry

boost::spirit например. просто с разными парсерами работаешь внутри своих factory functions

AnToXa
()
Ответ на: комментарий от anonymous

Во-первых flex - генератор ЛЕКСИЧЕСКИХ анализаторов, а для синтаксических используется bison (yacc).

Во-вторых есть ANTLR и bison+flex нифиг не нужны.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Присоединяюсь к Бегемоту, сам его использую.
Только у него сканер как раз медленный - а использую связку flex-antlr

Flogger_d
()
Ответ на: комментарий от Flogger_d

Я не интересовался его производительностью - надо было быстро парсер слепить - тут ANTLR куда лучше. А еще его анализаторы можно читать, чего не скажешь о bison.

boost::spirit при кольная штука - по идее именно так нужно писать парсеры (встроенный DSL), но уж очень долго компилируется парсер.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.