C ++, пытается написать объект чтения, ошибка при попытке получить данные из одного вектора

Я пытаюсь написать действительно простое средство чтения файлов obj, которое записывает все значения вершин в порядке из файла obj в один вектор (уже это сделано), а также записывает значения вершин, на которые ссылаются граничные значения из файла obj в другом векторе, для пример:

v1 = 0,0 0,0 0,0

v2 = 1,0 0,0 0,0

v3 = 1,0 1,0 0,0

f1 = 3 2 1

Моя программа записала бы все значения вершин по порядку в первом векторе
и затем записал бы значения вершин, составляющие грань, как показано во втором векторе:
1,0 1,0 0,0 1,0 0,0 0,0 0,0 0,0 0,0

Все работало нормально, пока я не попытался получить значения из первого вектора (verticesCoordsXYZ) и вставить их обратно во второй вектор (faceCoords). Код, который я закомментировал, ломает программу, кажется, что местоположение, которое я ищу в первом векторе, больше, чем размер вектора (когда программа ломается, я получаю out_of_range при ошибке памяти, и он говорит, что размер verticesCoordsXYZ равен 0), хотя я заполнил вектор всеми значениями вершин.

Что я делаю неправильно? Я не понимаю, как работают векторы, я выхожу из области видимости векторов? Как я могу исправить эту проблему?

    string line;
while (getline(modelfile, line))
{

string s;
istringstream iss(line);
iss >> s;
vector <float> verticesCoordsXYZ;
vector <float> faceCoords;

if (s == "v")
{

float x, y ,z;
iss >> x >> y >> z;
verticesCoordsXYZ.push_back(x);
verticesCoordsXYZ.push_back(y);
verticesCoordsXYZ.push_back(z);

for (int i = 0; i < (int)verticesCoordsXYZ.size(); i++)
{
cout << verticesCoordsXYZ.at(i);
}
cout << endl;

}

if (s == "f")
{
int a, b, c;

iss >> a >> b >> c;

int aLocation = a * 3 - 3; //vertice locations in verticeCoordsXYZ that would make up faces
int bLocation = b * 3 - 3;
int cLocation = c * 3 - 3;

for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(aLocation+i));
}
for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(bLocation+i));
}
for (int i = 0; i < 2; i++)
{
//faceCoords.push_back(verticesCoordsXYZ.at(cLocation+i));
}

for (int i = 0; i < (int)faceCoords.size(); i++)
{
cout << faceCoords.at(i) << "f";
}cout << endl << a << b << c;
}

}

modelfile.close();

0

Решение

Вы объявляете вектор внутри цикла while, чтобы он сбрасывался каждый раз при повторном цикле while.

Попробуйте объявить вектор перед циклом while

0

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

Вы воссоздаете векторы каждый раз через while цикл, потому что они объявлены внутри него. Это означает, что когда s == "f" они все пусты.

Вы должны объявить их вне while цикл, где вы объявляете line,

1

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