Чтение и сохранение значений из файлов .OBJ с использованием переполнения стека

Во-первых, простите за плохой английский. Я пытаюсь прочитать значения файла .OBJ (см. Вот) и сохраняем их в переменных с помощью этой программы:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
string line;
string v, valuesX[8], valuesY[8], valuesZ[8];
int n = 0;

ifstream myfile ("cubo.obj");
while(!myfile.eof())
{
getline (myfile,line);
if (line[0] == 'v')
{
myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];
cout << valuesX[n] << "\t" << valuesY[n] << "\t" << valuesZ[n] << endl;
n++;
}
}
return 0;
}

Файл — это всего лишь простой куб, экспортированный Blender. Я ожидал, что он покажет мне все строки, начинающиеся с «v», но в результате представлены только нечетные строки «v». Когда я читаю непосредственно значение переменной «строка», результат остается тем же. Тем не менее, когда я удаляю строку, которая присваивает значения переменным «value», и считываю переменную «line» напрямую, программа работает отлично. Кто-нибудь знает, объясните мне, что происходит? Почему программа игнорирует четные строки?

3

Решение

Как я уже упоминал в моем комментарии, вы читаете одну строку с:

getline (myfile,line);

а затем, если линия имеет v в первой позиции вы читаете еще одну строку с этим утверждением:

myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];

но вы не обрабатываете предыдущую строку, прочитанную с getline так что вы потеряете эту линию. Одним из возможных решений является обработка каждого line это соответствует использованию istringstraeam:

std::istringstream iss( line );
iss >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];
1

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

Вы читаете 2 строки за цикл:

Первый раз:

getline(myfile, line);

Второй раз:

myfile >> v >> valuesX[n] >> valuesY[n] >> valuesZ[n];

Таким образом, вы отбрасываете половину своих данных.

Решение: Попробуйте использовать ifstream::peek функция, чтобы увидеть, начинается ли строка с 'v', тогда вы бы прочитали все значения в ваши переменные.

2

По вопросам рекламы [email protected]