2016-11-02 8 views
-1

Я пытаюсь прочитать в следующем OBJ файлЧитайте в баллах от OBJ файла C++

#--- ObjWriter --- 
v -0.599972 -0.599972 -0.599972 
v -0.304591 -0.834531 0.539150 
. 
. 
. 
f 1 2 6 
f 1 6 5 
f 1 5 7 
. 
. 
. 

Я пытаюсь создать функцию, которая будет хранить значения в вершине (3 значения следующего полукокса V) к вектору точек (Pt составлен из ax, y и z) и значений грани (3 значения, следующих за char f), на другой вектор граней (Face состоит из 3 целых чисел). До сих пор, я попытался это с помощью следующей функции:

void readFile(char *inFile) 
{ 
    ifstream inF(inFile); 
    string line; 

    while (getline(inF, line)) 
    { 
     if (line[0] == 'v') 
     { 
      float x, y, z; 
      inF >> x >> y >> z; 

      // cout << x; 

      verts.push_back(Pt(x, y, z)); 
     } 
     else if (line[0] == 'f') 
     { 
      int x, y, z; 
      inF >> x >> y >> z; 
      faces.push_back(Face(x, y, z)); 
     } 
     else if (line[0] == '#') 
      continue; 
    } 
} 

Всякий раз, когда я проверяю этот метод отображения значения х в первом случае заявление, я получаю значение «-858993460». Как я могу исправить эту функцию? Размещение строки cout показано в комментариях.

+0

'' -858993460' является 0xCCCCCCCC' в шестнадцатеричном формате. Это шаблон отладочной версии CRT, который поставляется с Visual Studio, присваивает неинициализированные данные. Поскольку мы не можем, как вы «отображаете значение x в первом выражении if» *, мы не можем вам помочь или предоставить объяснение. – IInspectable

+0

Я положил cout, где я это сделал, чтобы проверить его. Кроме того, что было бы лучшим способом проверить, что все значения были успешно сохранены? – JMV12

+0

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

ответ

-1

вместо того, чтобы писать собственный читателя OBJ файл можно, например, использовать assimp (http://www.assimp.org)

относительно вашего кода: вы должны проверить, если строка пуста, прежде чем получить доступ к строке с индексом 0. Затем, когда чтение float, вы должны сначала пропустить символ из строки («v» в случае вершины). Вы могли бы, например, просто прочитать его в переменной фиктивного символа. И, наконец, >> изменяет состояние входного потока. Например, вы можете использовать stringstream и инициализировать его текущей строкой, а затем читать из этого потока.

Что-то вроде этого:

if(line.empty()) 
    continue; 

if (line[0] == 'v') 
{ 
    float x, y, z; 
    char dummy; 
    std::stringstream ss(line); 
    ss >> dummy >> x >> y >> z; 
    cout << x << ";" << y << ";" << z << "\n"; 
} 
+0

Зачем читать первый символ в фиктивный символ вместо того, чтобы читать его в правильную переменную 'char' и использовать это как вход для оператора' switch'/'case'? – IInspectable

+0

Проверка символа позволяет мне сохранять либо поплавки для v, либо int для f для использования в будущих вычислениях. Мне нужно провести различие между наборами значений. – JMV12

+0

Я хотел показать, как заставить код работать без особых изменений. Если бы я реализовал это, я бы не использовал stringstream и этот материал и реализовал бы простой синтаксический анализатор (FSM) и, следовательно, также разветвлялся бы на первом символе строки. – Harry

 Смежные вопросы

  • Нет связанных вопросов^_^