Пишу типа - парсер
От: ginger Россия  
Дата: 29.04.04 18:13
Оценка:
Мне надо из файла, все что находится между тегами <Title type="string"> и </Title>, ну допустим вывести на экран. Поидейно, конструкция должна работать, он находит iPosBegin, корректно, так же находит iPosEnd, тоже корректно, т.е. если из первого вычесть второе — это нам и надо, ну, не суть, Вся проблема в том, что я немного не понимаю, почему когда дело доходит до
tString.assign(sTemplate,iPosBegin+21,iPosEnd);
Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?
Помогите, плиз!
Вот код, творчески порезанный:


#include <string>
#include <iostream>
#include <fstream>
#include <stdexcept>

int main(int argc, char* argv[])
{
  using std::string;
  std::ifstream ifs;
  ifs.open("31621.xml", std::ios::in);
  if (!ifs) { throw std::logic_error("Cannot open template."); }
  unsigned int iPosBegin, iPosEnd;
  char szBuffer[65537];
  string sTemplate;
  while (!ifs.eof())
  {
    ifs.getline(szBuffer, 65536);
    sTemplate += szBuffer;
    sTemplate += '\n';
  }
  string tString;

      sTemplate.begin();
      iPosBegin = sTemplate.find("<Title type=\"string\">");
      if (iPosBegin != string::npos)
      {
        iPosEnd = sTemplate.find("</Title>");
        if (iPosEnd != string::npos)
        {
          tString.assign(sTemplate,iPosBegin+21,iPosEnd);
          std::cout << tString << std::endl;
        }
        else
        {
          std::cout << "Broken news! " << iPosBegin << " " << iPosEnd << std::endl;
          return -1;
        }
      }
  return 0;
}
Re: Пишу типа - парсер
От: _AK_ Россия  
Дата: 29.04.04 18:16
Оценка: +1 -1
Здравствуйте, ginger, Вы писали:

G>Мне надо из файла, все что находится между тегами <Title type="string"> и </Title>, ну допустим вывести на экран. Поидейно, конструкция должна работать, он находит iPosBegin, корректно, так же находит iPosEnd, тоже корректно, т.е. если из первого вычесть второе — это нам и надо, ну, не суть, Вся проблема в том, что я немного не понимаю, почему когда дело доходит до

G>tString.assign(sTemplate,iPosBegin+21,iPosEnd);
G>Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?
G>Помогите, плиз!
G>Вот код, творчески порезанный:


[мощный код поскипан]

может быть лучше воспользоваться boost::spirit? геморроя будет на порядок меньше...
Re[2]: Пишу типа - парсер
От: ginger Россия  
Дата: 29.04.04 18:19
Оценка:
Здравствуйте, _AK_, Вы писали:

_AK>Здравствуйте, ginger, Вы писали:


G>>Мне надо из файла, все что находится между тегами <Title type="string"> и </Title>, ну допустим вывести на экран. Поидейно, конструкция должна работать, он находит iPosBegin, корректно, так же находит iPosEnd, тоже корректно, т.е. если из первого вычесть второе — это нам и надо, ну, не суть, Вся проблема в том, что я немного не понимаю, почему когда дело доходит до

G>>tString.assign(sTemplate,iPosBegin+21,iPosEnd);
G>>Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?
G>>Помогите, плиз!
G>>Вот код, творчески порезанный:


_AK>[мощный код поскипан]


_AK>может быть лучше воспользоваться boost::spirit? геморроя будет на порядок меньше...


"Не стреляйте в пианиста он играет как умеет" (цы)
Я не так давно пишу на Си, что это? :-)
Re[3]: Пишу типа - парсер
От: _AK_ Россия  
Дата: 29.04.04 18:24
Оценка:
Здравствуйте, ginger, Вы писали:

G>Здравствуйте, _AK_, Вы писали:


_AK>>Здравствуйте, ginger, Вы писали:


G>>>Мне надо из файла, все что находится между тегами <Title type="string"> и </Title>, ну допустим вывести на экран. Поидейно, конструкция должна работать, он находит iPosBegin, корректно, так же находит iPosEnd, тоже корректно, т.е. если из первого вычесть второе — это нам и надо, ну, не суть, Вся проблема в том, что я немного не понимаю, почему когда дело доходит до

G>>>tString.assign(sTemplate,iPosBegin+21,iPosEnd);
G>>>Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?
G>>>Помогите, плиз!
G>>>Вот код, творчески порезанный:


_AK>>[мощный код поскипан]


_AK>>может быть лучше воспользоваться boost::spirit? геморроя будет на порядок меньше...


G>"Не стреляйте в пианиста он играет как умеет" (цы)

G>Я не так давно пишу на Си, что это?

http://www.boost.org/libs/spirit/doc/quick_start.html

смотри внизу пример.
Re[4]: Пишу типа - парсер
От: ginger Россия  
Дата: 29.04.04 18:32
Оценка:
Здравствуйте, _AK_, Вы писали:
G>>>>Мне надо из файла, все что находится между тегами <Title type="string"> и </Title>, ну допустим вывести на экран. Поидейно, конструкция должна работать, он находит iPosBegin, корректно, так же находит iPosEnd, тоже корректно, т.е. если из первого вычесть второе — это нам и надо, ну, не суть, Вся проблема в том, что я немного не понимаю, почему когда дело доходит до
G>>>>tString.assign(sTemplate,iPosBegin+21,iPosEnd);
G>>>>Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?
G>>>>Помогите, плиз!
G>>>>Вот код, творчески порезанный:
_AK>>>[мощный код поскипан]
_AK>>>может быть лучше воспользоваться boost::spirit? геморроя будет на порядок меньше...
G>>"Не стреляйте в пианиста он играет как умеет" (цы)
G>>Я не так давно пишу на Си, что это? :-)
_AK>http://www.boost.org/libs/spirit/doc/quick_start.html
_AK>смотри внизу пример.
А все-таки, почему не работает мой код? Интересно же, что бы больше на такие грабли не наступать?
Re: Пишу типа - парсер
От: ginger Россия  
Дата: 29.04.04 19:54
Оценка:
Все, разобрался :-)
Оказалось все гораздо проще...
Re: Пишу типа - парсер
От: Анатолий Широков СССР  
Дата: 29.04.04 20:01
Оценка:
G>tString.assign(sTemplate,iPosBegin+21,iPosEnd);
G>Он начало вырезает правильно в перменную tString, но на этом не оставнавливается а загоняет туда все что остается?

Причина кроется в том, что Вы не правильно понимаете смысл третьего параметра:

const char* w = "hello, world";

std::string s;
// начальная позиция
std::string::size_type pos = 7;
// количество символов
std::string::size_type n = 5;
// следующее присваивание помещает в s, начиная с 7 позиции (нумерация с 0), 5 символов
s.assign(w, pos, n);

// на выходе получаем world
std::cout << s;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.