Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
#1

парсер - C++

15.12.2012, 21:02. Просмотров 1345. Ответов 15
Метки нет (Все метки)

Добрый день, у меня возникла вот такая вот проблема...
При работе парсера, он разделяет строки как и задуманно, но появляются непредвиденные символы, невезь откуда.
Скорее всего подозрение падает на преобразование типа char -> char *
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int s_pars::Position(char symb,char *buff,int b_size)
{
    for (int i=0;i<b_size;i++)
    {
        if(i<2&&buff[i]=='/')
        {return -2;} // Код коментариев.
        if(buff[i]==symb)
        {return i;}
    }
    return -1;
}
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
if(d_mode) //смещаем данные
{
    for(int x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
return 0;
}
C++
1
2
3
4
5
6
7
gus21rus@NeuralComputer:~/Рабочий стол/Проекты/cheb21client/bin/Release$ ./cheb21client
Запуск приложения...
Thread started!
Начало конфигурации системы
Открытие конфигурационного файла: ОК
Чтение данных: Entering param LOADGUI|UУїпїЅ{e buff LOADGUI=true;
gus21rus@NeuralComputer:~/Рабочий стол/Проекты/cheb21client/bin/Release$
Использую сиауты что бы просмотреть что там находится, получаю вот данный вывод...
p.s Entering param LOADGUI|Uӿ�{e buff LOADGUI=true;

преобразование типа имеет следующий вид
C++
1
2
3
pars.ExtractString((char *)buff,&param[0],sizeof(buff),0,pos2,false);
раньше было
pars.ExtractString((char *)buff,(char *)param,sizeof(buff),0,pos2,false);
Данный парсер предназначен для конфигурирования системы принципом параметр=аргумент;

Добавлено через 3 часа 59 минут
эм, я может что то не так написал, если не получил еще ответа?)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 21:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос парсер (C++):

Парсер - C++
Доброго времени суток форумчане! Хочу написать парсер (я великий велосипедист). Язык реализации С++ или Java. Парсер нужен для того чтобы...

Парсер - C++
Здраствуйте! Есть видео файл. Я хочу найти в нем определенную структуру. Для этого мне нужно найти определенную последовательность...

Парсер - C++
Возник вопрос как лучше написать парсер. Интересно просто услышать советы. Грамматика примерно такова. /* Grammar * * Expr...

парсер строки - C++
Народ, помогите, плиз! проблема такая : сперва считываю строку из файла string value; getline (file, value, '\n'); ...

Парсер HTML - C++
Хочу написать прогу по выборке из своих html файлов некоторых тегов (img например). Пошел искать библиотеки парсинга и запутался. Их...

JSON парсер С++ - C++
Доброго времени суток, уважаемые пользователи cyberforum! Хотелось бы уточнить каким парсером лучше всего пользоваться? (Для...

15
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,527
15.12.2012, 21:18 #2
Цитата Сообщение от Gus Посмотреть сообщение
i<b_size
А если попробовать i < b_size + 1

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
А если попробовать i < b_size + 1
Нет, бред сказал. Прокомментируйте каждый параметр в вызываемой функции и и покажите их объявление.

Добавлено через 1 минуту
Gus, кароче мне кажется, что Вы теряете '\0'

Добавлено через 16 секунд
Цитата Сообщение от go Посмотреть сообщение
А если попробовать i < b_size + 1
И возможно это не бред.
0
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:25  [ТС] #3
пробывал! да проблема исчезает. последний символ стирается.

C++
1
2
3
4
5
6
7
8
if(strcmp(param,"LOADGUI")==0)
{
pars.ExtractString((char *)buff,(char *)arg,sizeof(buff),
                   pars.Position('=',(char *)buff,sizeof(buff)),
                   pars.Position(';',(char *)buff,sizeof(buff)),true);
                   cout <<"GUI CHECKED!"<<endl;
                   if(strcmp(arg,"true")==0){cout <<"OK"<<endl;}}
}
C++
1
pars.ExtractString((char *)buff,&param[0],sizeof(buff),0,pos2,false);
Два места откуда они вызываются.

Добавлено через 6 минут
так ваши слова не сразу понял коментирую.
ExtractString - 1 агрумент указатель входного буфера типа чара, где содержится строка
2 агрумент возвращаемый указатель.
3 Размер буффера (что бы не вылетел из массива)
4 начальная позиция (int)
5 конечная позиция (int)
6 сместить ли массив данных, на длину вырезанной строки(кол во символов) (bool)
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,527
15.12.2012, 21:30 #4
Цитата Сообщение от Gus Посмотреть сообщение
пробывал! да проблема исчезает. последний символ стирается.
Так а что сейчас случилось?

Добавлено через 1 минуту
Gus, Си-строка нуль-терминированная. Вы должны сами доставить нуль-терминатор.
0
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:36  [ТС] #5
попробуем... тогда с \0

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
if(d_mode) //смещаем данные
{
    for(int x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
strcat(r_buff,'\0');
return 0;
}
Segmentation fault (core dumped)
хотя не правильно сделал, сейчас по другому попробую.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 21:38 #6
да, работа с голыми указателями - она такая. чревата крашами и глюками.
почему вы не пользуетесь скажем std::string? планируете парсить миллионы строк и это типа оптимизация?
0
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:40  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int s_pars::ExtractString(char *buff,char *r_buff,int b_size, int pos1,int pos2,  bool d_mode)
{
int y=0;
int i,x;
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
r_buff[i+1]='\0';
if(d_mode) //смещаем данные
{
    for(x=0;x<=pos2;x++)
    {
        if(pos2+x!=b_size)
        {
            buff[x]=buff[pos2+x];
        }
    }
}
buff[pos2+(++x)]='\0';
return 0;
}
так тоже особо не помогло..

Добавлено через 51 секунду
согласен затея г..но, но как то привычнее работать с чаром. да и понятнее для мну будет немного. что я делаю и почему я это делаю)
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 21:42 #8
согласен затея г..но, но как то привычнее работать с чаром. да и понятнее для мну будет немного. что я делаю и почему я это делаю)
ну это вы зря. если утрировать эти слова, то можно казать что на ассемблере этот код будет понятнее.
стоит один раз освоить std::string и много много геморроя уйдет. к тому же осваивать там нечего,
все просто и понятно.
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,527
15.12.2012, 21:46 #9
Цитата Сообщение от Gus Посмотреть сообщение
strcat(r_buff,'\0');
А ничего, что strcat сначало будет искать этот самый '\0' ?
C++
1
2
3
4
5
6
7
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
 
r_buff[y] = '\0';
0
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
15.12.2012, 21:48  [ТС] #10
я пользовался string AnsiString но в конечном счете мне более по нраву char.

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
А ничего, что strcat сначало будет искать этот самый '\0' ?
C++
1
2
3
4
5
6
7
for (i=pos1;i<pos2&&i<b_size;i++)
{
    r_buff[y]=buff[i];
    y++;
}
 
r_buff[y] = '\0';
C++
1
r_buff[i+1]='\0';
в ручную добавил
0
go
Эксперт С++
3586 / 1366 / 129
Регистрация: 16.04.2009
Сообщений: 4,527
15.12.2012, 22:09 #11
Цитата Сообщение от Gus Посмотреть сообщение
в ручную добавил
Получили желаемый результат?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.12.2012, 22:11 #12
вот накидал по быстрому примерно то, чего вы хотите сделать:
http://liveworkspace.org/code/4piPYI$4
задача свелась к подзадачкам:
нужно как-то перечислять строки из файла. делается. просто.
нужно более навороченный парсер, скажем чтобы строки 'key = value' были корректными.
ну и остается просто правильно интерпретировать строки в получившейся мапине.

это для сравнения. больше половина кода - это тупо обработка ошибок. без обработки все вообще трехстрочное.
1
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
16.12.2012, 00:46  [ТС] #13
но к сожалению проблема не ушла.

Добавлено через 2 часа 27 минут
зачем так жить если возникает ошибка Core dumped?
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
16.12.2012, 00:55 #14
это типа ап такой чтоли?
вы сказали голые указатели вам понятнее и проще. вот радуйтесь. вроде все просто, но ошибится в индексах, залезть не в ту память и получить краш - это как здрасти.
более высокоуровневые классы придумали не от хорошей жизни. пользуйтесь ими.
и второй совет: освойте отладчик той среды, в которой работаете. подобного рода краши с отладчиком находятся и исправляются без особых проблем.
1
Gus
25 / 36 / 2
Регистрация: 17.02.2009
Сообщений: 364
16.12.2012, 13:20  [ТС] #15
Кхмм. странно... в Debug режиме программа не выдает этой ошибки.
в режиме Release ошибка появляется.
Используется стандартный отладчик GDB
0
16.12.2012, 13:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2012, 13:20
Привет! Вот еще темы с ответами:

Парсер аудиофайлов - C++
Всем привет! У меня возникла такая идея: Допустим есть некая директория, содержащая аудиофайлы(много аудиофайлов).Надо определить...

Парсер, utf-8 - C++
Помогите пожалуйста разобраться с кодировкой. Прочитал немного статей и литературы, но полного понимание ситуации с кодировкой так и нет....

Парсер паскаля - C++
Добрый день. Задача такая: нужно на С++ написать парсер паскаля, так чтоб тот по коду мог вызывать нужные функции отрисовки блок-схемы.

Наипростейший парсер - C++
Никак не могу вникнуть в простейшй парсер математического выражения. Мне нужно просто просчитать пример, в котором только + и - и ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru