WedX - журнал о программировании и компьютерных науках

Токенизация строк C++ из 3D-файлов .obj

Я новичок в С++ и искал хороший способ вытащить данные из этой строки.

Пример строки, которую мне может понадобиться для токенизации:

f 11/65/11 16/70/16 17/69/17

У меня есть метод токенизации, который разбивает строки на вектор, разделенный строкой, которая может быть полезна.

static void Tokenise(const string& str, vector<string>& tokens, const string& delimiters = " ")

Единственный способ, который я могу придумать, - это токенизировать с " " в качестве разделителя, удалить первый элемент из результирующего вектора, а затем токенизировать каждую часть отдельно. Есть ли хороший способ сделать все это в одном?

12.05.2010

Ответы:


1

Я вижу, что вопрос помечен как C++, но проще всего это сделать с помощью scanf

int indices[3][3];
sscanf(buffer, "f %d/%d/%d %d/%d/%d %d/%d/%d", &indices[0][0], &indices[0][1],...);
12.05.2010
  • Это также довольно хороший способ сделать это. Я обязательно буду иметь в виду функции C в будущем, возможно, даже реализую это. Легко самое аккуратное решение, что приятно. 12.05.2010
  • Для синтаксического анализа .obj это кажется, по крайней мере, для меня решением, которое проще всего читать и писать. В итоге вы получите около 50 строк кода для разбора всего формата файла. Не идите по пути токенизатор-лексер-парсер; это слишком запутанно для чего-то столь же простого, как это. 12.05.2010

  • 2

    Вы должны взглянуть на Boost.Tokenizer и особенно на это:

    // char_sep_example_1.cpp
    #include <iostream>
    #include <boost/tokenizer.hpp>
    #include <string>
    
    int main()
    {
      std::string str = ";;Hello|world||-foo--bar;yow;baz|";
      typedef boost::tokenizer<boost::char_separator<char> > 
        tokenizer;
      boost::char_separator<char> sep("-;|");
      tokenizer tokens(str, sep);
      for (tokenizer::iterator tok_iter = tokens.begin();
           tok_iter != tokens.end(); ++tok_iter)
        std::cout << "<" << *tok_iter << "> ";
      std::cout << "\n";
      return EXIT_SUCCESS;
    }
    
    12.05.2010
  • Спасибо. Я узнаю у своего наставника, смогу ли я использовать Boost в рамках этого задания. 12.05.2010

  • 3

    Судя по строке образца, вы можете использовать два разделителя ' ' и '/', и вы получите все свои числа.

    static void Tokenise(const string& str, vector<string>& tokens, const string& delimiters = " /")

    12.05.2010
  • Спасибо, но моя функция токенизации так не работает. Я буду более ясным в будущем :) 12.05.2010

  • 4

    Вы можете легко удалить первую часть до первого пробела или сразу после f (вы можете получить остальные после первого пробела с помощью

    istringstream iss( line );
    std::getline( iss, restStr ,' ' )
    

    Затем вы можете использовать свою функцию токенизации сначала на пустом месте, а затем на '/', или просто использовать набор std::getline и istringstreams в одном цикле.

    int main()
    {
        std::string s = "f 1/2/3 4/4/2";
    
        std::istringstream issLine( s );
    
        std::string result;
    
        // remove the first "f"
        std::getline( issLine, result, ' ' );
    
        // parse blanks
        while( std::getline( issLine, result, ' ' ) )
        {
            std::istringstream issToken( result );
            std::string token;
    
            //parse content
            while( std::getline( issToken, token, '/' ))
            {
                std::cout << token << ',';
                // add your data in whatever you want
            }
            std::cout << std::endl;
        }
    }
    
    21.05.2010

    5
  • Кто бы ни проголосовал за это, пожалуйста, скажите мне, что с этим не так? 12.05.2010
  • Я немного новичок в программировании, чтобы хорошо следовать этому. Однако я буду читать об общем программировании и шаблонах, чтобы понять это. У меня сложилось впечатление, что это правильный способ сделать это, каким бы длинным он ни казался. Спасибо :) 12.05.2010
  • @Ben: Это кажется долгим только до тех пор, пока у вас нет этих трех функций в вашем наборе инструментов. Как только вы это сделаете, останется то, что находится в main(), и это не так уж и долго. 12.05.2010
  • Спасибо. Я, вероятно, буду реализовывать этот метод, однако я выбрал другой просто потому, что он более точно ответил на мой вопрос. 12.05.2010
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]