Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
1

Быстрый парсинг строки

24.11.2015, 13:02. Показов 2775. Ответов 4
Метки нет (Все метки)

Всем доброго времени суток... Прошу разъяснить что делаю не так.
Получаю строку вида, нужно ее обработать с минимальными задержками, по этому посмотрел в сторону strtok:
"B 1023 0 0 0 0 0 0 0 E
74 E

"

Нужно ее обработать. Важна только первая строчка, все остальное - мусор, который меняется. Пытаюсь сделать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//бежим до первого перехода на новую строку
char* tmp = strtok(buf, "\r"); 
//выводим, получили то что нужно "B 1023 0 0 0 0 0 0 0 E"
std::cout << tmp;
 
//парсим tmp
char* tmp1 = strtok(tmp, " ");  
while (tmp1 != NULL)
{
std::cout << tmp1;
tmp1 = strtok(NULL, " ");
}  
 
std::cout << std::endl;
Запускаю, получаю странную картину, обрабатывает 2 раза правильно, потом ерунда:
Кликните здесь для просмотра всего текста

B 1023 0 0 0 0 0 0 0 EB10230000000E
B 1023 0 0 0 0 0 0 0 EB10230000000E
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
B 1023 0 0 0 0 0 0 0 EB10230000000E
B 1023 0 0 0 0 0 0 0 EB10230000000E
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB
BB

Что я делаю не так ? Ведь если убрать обработку tmp, то будет выводить все правильно, только первую строку.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.11.2015, 13:02
Ответы с готовыми решениями:

быстрый парсинг
&lt;? $content= file_get_contents('http://kosmoskan.ru/?page=rasp'); preg_match_all('~&lt;h3...

Быстрый парсинг Excel
Господа, прошу помощи. Суть: есть (и раз в неделю добавляется) сотня файлов *.xls. Содержимое - 1...

Быстрая работа со строкой (быстрый парсинг)
Есть строка вида &quot;имя1(значение1),имя2(значение2),&quot; Где &quot;имя&quot; и &quot;значение&quot; могут иметь...

Быстрый парсинг огромного txt файла (800 мб)
В общем нужно распарсить в массив Integer-ов огромный текстовый файл (800 мб), состоящий из 1...

4
2725 / 1888 / 560
Регистрация: 05.06.2014
Сообщений: 5,504
24.11.2015, 15:18 2
Во второй строчке strtok возвращает указатель на свой внутренний буфер. В седьмой строчке вы просите strtok распарсить этот буфер, а результаты он кладет... Правильно, в тот самый буфер, который и парсит. В итоге получается какая-то фигня. Надо как-то так:
C++
1
2
3
4
5
6
const char buf[]="B 1023 0 0 0 0 0 0 0 E";
const char*end=buf;
for(;*end && *end!='\n';++end);
for(const char*pos=buf;pos<end;++pos)
    if(*pos!=' ')
        cout<<*pos;
0
17 / 17 / 5
Регистрация: 19.09.2012
Сообщений: 216
24.11.2015, 15:48  [ТС] 3
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Посимвольно ведь можем получить после первой работы strtok
0
2725 / 1888 / 560
Регистрация: 05.06.2014
Сообщений: 5,504
24.11.2015, 16:18 4
Цитата Сообщение от Fobes Посмотреть сообщение
Renji, хм, основная цель стоит разбить на лексемы строку и привести цифры к int'у, а не на отдельные символы. Как быть ?
Если нужно максимально быстро, то писать свой парсер. Если максимально просто, то преобразовать строку в поток (std::stringstream) и читать через >>.
0
1454 / 791 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
24.11.2015, 18:10 5
Можно по быстрому через spirit:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#define BOOST_NO_AUTO_PTR
#include <iostream>
#include <string>
#include <vector>
#include <boost/spirit/include/qi.hpp>
 
namespace qi = boost::spirit::qi;
 
int main()
{
   std::string str = "A B C DD 1023 1 2 3 4 5 6 7 42 84 E\n"
                     "74 E\n"
                     " \n";
   std::vector<int> v;
   qi::phrase_parse(str.begin(), str.end(), (*qi::omit[qi::alpha] >> *qi::int_), qi::space, v);
   for (int i : v) std::cout << i << " ";
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.11.2015, 18:10

Быстрый поиск строки в списке строк
Здравствуйте. Необходимо реализовать быстрый поиск строки в списке строк в целях исследования...

Быстрый перевод части строки в число
Привет всем! Столкнулся с необходимостью быстрого преобразования части строки в число, т.е. нужно...

Переносимый, быстрый и безопасный ввод строки
Чёт не нашёл темы поиском, хотя это наверняка обсуждалось. Смысл в шапке, ограничения: 1....

Самый быстрый способ получить хеш строки
Добрый день! Такая проблема. Мне нужно искать дублированные строки в файле из 1 млн. строк. Если...


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

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

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