Я пытаюсь написать действительно простое средство чтения файлов 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();
Вы объявляете вектор внутри цикла while, чтобы он сбрасывался каждый раз при повторном цикле while.
Попробуйте объявить вектор перед циклом while
Вы воссоздаете векторы каждый раз через while
цикл, потому что они объявлены внутри него. Это означает, что когда s == "f"
они все пусты.
Вы должны объявить их вне while
цикл, где вы объявляете line
,