| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > аналог std::string::find_last_of, но для stl |
| Автор: EvilsInterrupt 24.7.2010, 09:48 | ||
Есть два вопроса, первый по С++ и разработке, второй по строению ini-файлов. Пишу парсер CIniFile только для чтения. Сначала в конструкторе CIniFile вычлению секции, а потом уже создаю CIniSection и в конструктор передаю значения от начала секции до конца файла или начала другой секции. При обращении к параметрам, если секция еще не распарсена, то CIniSection парсит. Получается небольшая убогая "псевдо"-ленивая , но удобная для меня реализация ))) Вопрос №1: В коде по парсингу значения ини-секции веду разбор , вычленяю наименования параметров и их значений. Код организован на применения строковых итераторов:
и далее уже в терминах p и Eos Сейчас столкнулся с тем, что мне удобно пискать последний символ '"', т.е. ковычки. Но STL-алгоритма std::find_last_of() не существует !!! Что делать? Писать самому аналог или есть уже готовое решение ? Вопрос №2: Касается структуры самого ini-файла. В виду того что нет каких-либо стандартов на такие файлы и каждая прога работает по своему, как считает нужным и правильным, то у меня возникла не однозначность при получении значения параметра, прошу помочь разобраться. В чем сложность? Что понимать под значением параметра? Насколько я понял, мне надо читать до конца строки \ символа коментария (';', '#') или до символа ковычек, т.к. человек может захотеть включить в значение символы которые в обычном режиме посчитались бы символами коментариев. Пример: ParamValue = "INIT; DEVICE_CMD = #0010-0101010" или еще как-то, символы коментов(точка-зпт и решетка) довольно часто встречаются в командах к модемам и устройствам последовательного интерфейса. Но мне бы хотелось услышать рекомендации и советы других людей. Итого, формулировка вопроса "Что считать значением параметра?" |
| Автор: djamshud 24.7.2010, 10:29 |
| 1. wtf find_last_of? Поиск подстроки с конца? В стандартной библиотеке такого по-моему нет, но пишется за 30 секунд. 2. Параметр - это все, что правее знака равно и до конца строки за вычетом пробелов и табуляций с обеих сторон (если они не в кавычках). Комментарии начинаются в начале строки. Еще можно сделать символ \ - знак игнорирования или особенности значения следующего символа, чтобы сделать например так: pamparam = hello \ world\nblablabla Удобно для длинных и многострочных значений параметров. ... Вы пишите хреновый парсер, вам бы литературы почитать по теории компиляторов. Первых глав о лексическом и синтаксическом анализе будет достаточно. Дело в том, что реализация "неленивого", как вы говорите, парсера будет намного проще этой куралесицы с постоянным прыжками по тексту. Имхо. |
| Автор: EvilsInterrupt 24.7.2010, 10:40 |
| djamshud, я пока привыкаю к использованию STL, мне жутко не удобно с ним. Поэтому это одна из задач, которые хочу уже давно решить в виде библиотеки. Конечно, сейчас я сделаю неудобное решение, но ведь надо с чего-то начинать! Я итак на многом сижу много времени, т.к. пытаюсь сделать по уму, а вы говорите об ини-файле про лексический и другие анализе , так я вообще ничего не напишу, т.к. буду стремиться к идеалу ) |
| Автор: Abyx 24.7.2010, 11:17 |
| EvilsInterrupt, используйте std::find и reverse_iterator'ы : rbegin, rend - ищите с конца Добавлено через 1 минуту и 44 секунды алсо попробуйте использовать для парсинга boost.spirit, или boost.tokenizer или регулярки |
| Автор: mes 24.7.2010, 11:20 |
| применить find(_first_of) для reverse итераторов.. опоздал |
| Автор: EvilsInterrupt 24.7.2010, 11:36 |
| Abyx, Вот только не boost , причины : 1) сколько было вакансий, всегда требовали "без стороних библиотек, а STL таковой не считает" 2) Я в нем на данном уровне знания С++ утону! |
| Автор: Abyx 24.7.2010, 12:00 |
| EvilsInterrupt, boost::regex в C++0x стало std::regex =) многие другие либы буста тоже |
| Автор: EvilsInterrupt 24.7.2010, 14:35 | ||||
| Ща пишу алгоритм, find_last_of , аналог std::find_first_of и редиска Lazin все раскритиковал )))
мне надо именно обобщенное. Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate для выделения нужной инструкции к примеру: просьба подмогнуть ;)
|
| Автор: EgorTheBlade 24.7.2010, 14:58 | ||
Так вам требуется?только вместо std::cout<<max; return max; |
| Автор: EvilsInterrupt 24.7.2010, 15:14 |
| EgorTheBlade, Ты читал строки: >>Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate ? |