синтаксический анализ — C ++ .obj лицо парсера

Сложно передать номиналы .obj файла в вектор.

f 5/1/1 1/2/1 4/3/1
f 5/1/1 4/3/1 8/4/1
f 3/5/2 7/6/2 8/7/2

Это то, что мне нужно хранить, но

f 5//1 1//1 4//1
f 5//1 4//1 8//1
f 3//2 7//2 8//2

Иногда это может быть так, и я не знаю, как обойти проблему, спасибо.

1

Решение

Вот пример, который использует boost::tokenizer я использую stdin читать входные данные (все значения после ‘f’), а затем я просто выводю значения на терминал. Я уверен, что вы можете изменить это, чтобы читать из файла и размещать значения там, где они вам нужны.

Пример 1

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;

void ParseFace(const string& face);
int main(){
cout << "Input a string: " << endl;
string s;
getline(cin,s);
ParseFace(s);
return 0;
}

void ParseFace(const string& face){
boost::char_separator<char> sep(" /");
boost::tokenizer<boost::char_separator<char> > tokens(face, sep);
for(tokenizer<boost::char_separator<char> >::iterator beg=tokens.begin(); beg!=tokens.end();++beg){
cout << *beg << "\n";
}
}

Образец вывода:

Input a string:
3/5/2 7/6/2 8/7/2
3
5
2
7
6
2
8
7
2

Input a string:
5//1 1//1 4//1
5
1
1
1
4
1

Пример 2

Принять к сведению линии boost::char_separator<char> sep(" /"); Это спецификатор для всех токенов, которые будут считаться действительными разделителями. В вашем случае может быть удобнее изменить это на boost::char_separator<char> sep("/"); (без пробелов), а затем просто читать строки следующим образом:

#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
#include <sstream>
using namespace std;
using namespace boost;

void ParseFace(istringstream& _input);
int main(){
cout << "Input a string: " << endl;
string s;
getline(cin,s);
istringstream input(s);
char isFace = 'v';
input >> isFace;
if (!input.fail()){
if (isFace == 'f')
ParseFace(input);
}
return 0;
}

void ParseFace(istringstream& _input){
string nextVal;
_input >> nextVal;
while(!_input.fail()){
cout << "Next set: " << endl;
boost::char_separator<char> sep("/");
boost::tokenizer<boost::char_separator<char> > tokens(nextVal, sep);
for(tokenizer<boost::char_separator<char> >::iterator beg=tokens.begin(); beg!=tokens.end();++beg){
cout << *beg << "\n";
}
_input >> nextVal;
}
}

Образец вывода:

Input a string:
f 5/1/1 1/2/1 4/3/1
Next set:
5
1
1
Next set:
1
2
1
Next set:
4
3
1

Input a string:
f 5//1 1//1 4//1
Next set:
5
1
Next set:
1
1
Next set:
4
1

Во втором примере я использую поток строк, чтобы прочитать отдельные строки из всего ввода, и использую элементарную проверку, чтобы увидеть, является ли первый символ ‘f’. Этот пример также должен быть адаптирован к вашим потребностям.

2

Другие решения

Других решений пока нет …