Форум программистов, компьютерный форум CyberForum.ru

Парсинг текста - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.78
aidalexeyaid
0 / 0 / 0
Регистрация: 28.07.2011
Сообщений: 42
05.08.2011, 18:11     Парсинг текста #1
Снова здравствуйте вообщем делаю Post запрос на который приходит ответ вида
Код
{"timer1":0,"timer2":0,"timer3":8153,"timer4":22569,"timer5":36983}
есть кнопка и после её нажатия нужно вытащить все 5 цифр после двоеточий и засунуть в лейблы

тоесть должно в конце выйти так

Label1->Caption = "0";
Label2->Caption = "0";
Label3->Caption = "8153";
Label4->Caption = "22569";
Label5->Caption = "36983";

Спасибо
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
05.08.2011, 18:23     Парсинг текста #2
вот вариант.
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
#include <iostream>
using namespace std;
 
// вот парсер
const char* str_num(char* _out, const char* str) {
   const char* p = strchr(str, ':');
   if(! p)
        return NULL;
   *p++;
   while( *p && *p != ',' && *p != '"')
      *_out++ = *p++;
   *_out = '\0';
   return p;
}
 
 
int main(void) {
 
   char str[] = "{\"timer1\":0,\"timer2\":0,\"timer3\":8153,\"timer4\":22569,\"timer5\":36983\"}";
 
   const char* first = str;
   char buf[16];
 
   while((first = str_num(buf, first)) != NULL)
        cout << buf << endl;
 
   cin.get();
   return 0;
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 18:49     Парсинг текста #3
C
1
2
3
4
5
6
7
8
9
10
11
    char str[]="{\"timer1\":0,\"timer2\":0,\"timer3\":8153,\"timer4\":22569,\"timer5\":36983\"}";
 
    int tmp=0;
    char *p;
 
    p =strchr(str,':');
    while ( p ) {
        sscanf(p+1,"%d",&tmp);
        printf("%d\n",tmp);
        p = strchr(p+1,':');
    }
в лейбл сам запихнёшь
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
05.08.2011, 20:00     Парсинг текста #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
aidalexeyaid,

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
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <boost/spirit/core.hpp>
#include <boost/spirit/actor/push_back_actor.hpp>
 
bool ParseNumbers(const std::string& str, std::vector <int> & vec)
{
   return boost::spirit::parse(str.c_str(),
      ( ( boost::spirit::lexeme_d['"' >> (*~boost::spirit::ch_p('"')) >> '"'] >> ":" >> boost::spirit::int_p[boost::spirit::push_back_a(vec)] ) % ',' ),
      boost::spirit::ch_p('{')
   ).full;
}
 
int main()
{
   std::string str = "{\"timer1\":0,\"timer2\":0,\"timer3\":8153,\"timer4\":22569,\"timer5\":36983,\"timer6\":738786}";
   std::vector <int> vec_numbers;
 
   ParseNumbers(str, vec_numbers);
 
   std::for_each(vec_numbers.begin(), vec_numbers.end(), [](int number) { 
      std::cout << number << std::endl;
   } );
 
   return 0;
}
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
05.08.2011, 20:25     Парсинг текста #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Раз уж предложили вариант со спиритом, тогда и я чтоль внесу свои пять копеек, на spirit V2:

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
33
34
35
36
37
38
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
 
#include <boost/spirit/include/qi.hpp>
 
bool ParseNumbers(std::string & str, std::vector<int> & nums)
    {
    std::string::iterator begin = str.begin(), end = str.end();
 
    namespace qi = boost::spirit::qi;
    return qi::parse(begin, end,
                (
                '{' >>
                    (
                    qi::omit[*(qi::char_ - ':')] >> ':'
                    >> qi::int_
                    ) % ','
                >> '}'
                ), nums
            ) && begin == end;
    }
 
int main()
    {
    std::string str 
        = "{\"timer1\":0,\"timer2\":0,\"timer3\":8153,\"timer4\":22569,\"timer5\":36983,\"timer6\":738786}";
    std::vector<int> nums;
 
    ParseNumbers(str, nums);
 
    std::for_each(nums.begin(), nums.end(), [](int n)
        {
        std::cout << n << ' ';
        }
    );
    }
Yandex
Объявления
05.08.2011, 20:25     Парсинг текста
Ответ Создать тему
Опции темы

Текущее время: 20:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru