Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог std::string::find_last_of, но для stl 
:(
    Опции темы
EvilsInterrupt
Дата 24.7.2010, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9




Есть два вопроса, первый по С++ и разработке, второй по строению 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" или еще как-то, символы коментов(точка-зпт и решетка) довольно часто встречаются в командах к модемам и устройствам последовательного интерфейса.

Но мне  бы хотелось услышать рекомендации и советы других людей.

Итого, формулировка вопроса "Что считать значением параметра?"
PM MAIL WWW ICQ Jabber   Вверх
djamshud
Дата 24.7.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM   Вверх
EvilsInterrupt
Дата 24.7.2010, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



djamshud, я пока привыкаю к использованию STL, мне  жутко не удобно с ним. Поэтому это одна из задач, которые хочу уже давно решить в виде библиотеки. Конечно, сейчас я сделаю неудобное решение, но ведь надо с чего-то начинать! Я итак на многом сижу много  времени, т.к. пытаюсь сделать по уму, а вы говорите об ини-файле про лексический и другие анализе , так я вообще ничего не напишу, т.к. буду стремиться к идеалу )
PM MAIL WWW ICQ Jabber   Вверх
Abyx
Дата 24.7.2010, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



EvilsInterrupt, используйте std::find и reverse_iterator'ы : rbegin, rend - ищите с конца

Добавлено через 1 минуту и 44 секунды
алсо попробуйте использовать для парсинга boost.spirit, или boost.tokenizer или регулярки
PM MAIL   Вверх
mes
Дата 24.7.2010, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



применить find(_first_of) для reverse итераторов.. smile

опоздал smile

Это сообщение отредактировал(а) mes - 24.7.2010, 11:21


--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 24.7.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Abyx, Вот только не boost , причины : 1) сколько было вакансий, всегда требовали "без стороних библиотек, а STL таковой не считает" 2) Я в нем на данном уровне знания С++ утону!
PM MAIL WWW ICQ Jabber   Вверх
Abyx
Дата 24.7.2010, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



EvilsInterrupt, boost::regex в C++0x стало std::regex =)
многие другие либы буста тоже
PM MAIL   Вверх
EvilsInterrupt
Дата 24.7.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



Ща пишу алгоритм,

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 );

PM MAIL WWW ICQ Jabber   Вверх
EgorTheBlade
Дата 24.7.2010, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 5.12.2009

Репутация: нет
Всего: -1



Код

    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;

Это сообщение отредактировал(а) EgorTheBlade - 24.7.2010, 14:59
PM MAIL Skype   Вверх
EvilsInterrupt
Дата 24.7.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: 2
Всего: 9



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

?
PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0801 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.