![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Есть два вопроса, первый по С++ и разработке, второй по строению ini-файлов. Пишу парсер CIniFile только для чтения. Сначала в конструкторе CIniFile вычлению секции, а потом уже создаю CIniSection и в конструктор передаю значения от начала секции до конца файла или начала другой секции. При обращении к параметрам, если секция еще не распарсена, то CIniSection парсит. Получается небольшая убогая "псевдо"-ленивая , но удобная для меня реализация ))) Вопрос №1: В коде по парсингу значения ини-секции веду разбор , вычленяю наименования параметров и их значений. Код организован на применения строковых итераторов:
и далее уже в терминах p и Eos Сейчас столкнулся с тем, что мне удобно пискать последний символ '"', т.е. ковычки. Но STL-алгоритма std::find_last_of() не существует !!! Что делать? Писать самому аналог или есть уже готовое решение ? Вопрос №2: Касается структуры самого ini-файла. В виду того что нет каких-либо стандартов на такие файлы и каждая прога работает по своему, как считает нужным и правильным, то у меня возникла не однозначность при получении значения параметра, прошу помочь разобраться. В чем сложность? Что понимать под значением параметра? Насколько я понял, мне надо читать до конца строки \ символа коментария (';', '#') или до символа ковычек, т.к. человек может захотеть включить в значение символы которые в обычном режиме посчитались бы символами коментариев. Пример: ParamValue = "INIT; DEVICE_CMD = #0010-0101010" или еще как-то, символы коментов(точка-зпт и решетка) довольно часто встречаются в командах к модемам и устройствам последовательного интерфейса. Но мне бы хотелось услышать рекомендации и советы других людей. Итого, формулировка вопроса "Что считать значением параметра?" |
|||
|
||||
djamshud |
|
|||
![]() Пердупержденный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 23.11.2009 Репутация: 8 Всего: 39 |
1. wtf find_last_of? Поиск подстроки с конца? В стандартной библиотеке такого по-моему нет, но пишется за 30 секунд.
2. Параметр - это все, что правее знака равно и до конца строки за вычетом пробелов и табуляций с обеих сторон (если они не в кавычках). Комментарии начинаются в начале строки. Еще можно сделать символ \ - знак игнорирования или особенности значения следующего символа, чтобы сделать например так: pamparam = hello \ world\nblablabla Удобно для длинных и многострочных значений параметров. ... Вы пишите хреновый парсер, вам бы литературы почитать по теории компиляторов. Первых глав о лексическом и синтаксическом анализе будет достаточно. Дело в том, что реализация "неленивого", как вы говорите, парсера будет намного проще этой куралесицы с постоянным прыжками по тексту. Имхо. -------------------- 'Cuz I never walk away from what I know is right Alice Cooper - Freedom |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
djamshud, я пока привыкаю к использованию STL, мне жутко не удобно с ним. Поэтому это одна из задач, которые хочу уже давно решить в виде библиотеки. Конечно, сейчас я сделаю неудобное решение, но ведь надо с чего-то начинать! Я итак на многом сижу много времени, т.к. пытаюсь сделать по уму, а вы говорите об ини-файле про лексический и другие анализе , так я вообще ничего не напишу, т.к. буду стремиться к идеалу )
|
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
EvilsInterrupt, используйте std::find и reverse_iterator'ы : rbegin, rend - ищите с конца
Добавлено через 1 минуту и 44 секунды алсо попробуйте использовать для парсинга boost.spirit, или boost.tokenizer или регулярки |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
применить find(_first_of) для reverse итераторов..
![]() опоздал ![]() Это сообщение отредактировал(а) mes - 24.7.2010, 11:21 |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Abyx, Вот только не boost , причины : 1) сколько было вакансий, всегда требовали "без стороних библиотек, а STL таковой не считает" 2) Я в нем на данном уровне знания С++ утону!
|
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 1 Всего: 10 |
EvilsInterrupt, boost::regex в C++0x стало std::regex =)
многие другие либы буста тоже |
|||
|
||||
EvilsInterrupt |
|
||||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
Ща пишу алгоритм,
find_last_of , аналог std::find_first_of и редиска Lazin все раскритиковал )))
мне надо именно обобщенное. Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate для выделения нужной инструкции к примеру: просьба подмогнуть ;)
|
||||
|
|||||
EgorTheBlade |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 5.12.2009 Репутация: нет Всего: -1 |
Так вам требуется?только вместо std::cout<<max; return max; Это сообщение отредактировал(а) EgorTheBlade - 24.7.2010, 14:59 |
|||
|
||||
EvilsInterrupt |
|
|||
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: 2 Всего: 9 |
EgorTheBlade, Ты читал строки:
>>Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate ? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |