Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > аналог std::string::find_last_of, но для stl


Автор: EvilsInterrupt 24.7.2010, 09:48

Есть два вопроса, первый по С++ и разработке, второй по строению ini-файлов.

Пишу парсер CIniFile только для чтения. Сначала в конструкторе CIniFile вычлению секции, а потом уже создаю CIniSection и в конструктор передаю значения от начала секции до конца файла или начала другой секции. При обращении к параметрам, если секция еще не распарсена, то CIniSection парсит. Получается небольшая убогая "псевдо"-ленивая , но  удобная для меня реализация )))

Вопрос №1:

В коде по парсингу значения ини-секции веду разбор , вычленяю наименования параметров и их значений. Код организован на применения строковых итераторов:

Код

typedef std::string::iterator StrItr_t;

StrItr_t  Eos = m_Content.end();
StrItr_t  p     = m_Content.begin();


и далее уже в терминах 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 итераторов.. smile

опоздал smile

Автор: 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 все раскритиковал )))

Код

template<typename InItr, typename InVal>
inline InItr find_last_of(InItr begin, InItr end, InVal & Val)
{
  InItr Res = end;
  for(InItr i = begin; i != end; i++) {
    if(Val == *It)
      Res = i;
  }
  return( Res );
}
  


мне надо именно обобщенное. Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate для выделения нужной инструкции к примеру:

просьба подмогнуть ;)

Код

std::find_last_of(  emu.begin(), emu.end(), CALL_INSTR );

Автор: EgorTheBlade 24.7.2010, 14:58
Код

    short temp[5];
        short cnt = 0;
        short x[5] ={1,2,3,4,1};
        for(int i = 0 ; i < 5; i++)
            if(x[i] == 1){
                temp[cnt] = i;
                cnt++;
            }
            short max = 0;
            for(int i = 0;i <= cnt ; i++)
            {
                if(max < temp[i])max = temp[i];
            }
            std::cout<<max;

Так вам требуется?только вместо std::cout<<max; return max;

Автор: EvilsInterrupt 24.7.2010, 15:14
EgorTheBlade, Ты читал строки:
>>Потому что сейчас это std::string , а завтра уже будет нужен для моего CX86Emulate

?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)