C++,尝试写入对象 reader,尝试从一个向量获取数据时出错
C++, trying to write an object reader, error when trying to get data from one vector
我正在尝试编写一个非常简单的 obj 文件 reader,它将所有顶点值从 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 at memory loc 错误,它说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
循环都在重新创建向量,因为它们是在其中声明的。这意味着当s == "f"
它们都是空的。
您应该在 while
循环之外声明它们,您在其中声明 line
.
您在 while 循环中声明 vector 以便每次 while go 循环时它都会被重置。
尝试在 while 循环之前声明向量
我正在尝试编写一个非常简单的 obj 文件 reader,它将所有顶点值从 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 at memory loc 错误,它说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
循环都在重新创建向量,因为它们是在其中声明的。这意味着当s == "f"
它们都是空的。
您应该在 while
循环之外声明它们,您在其中声明 line
.
您在 while 循环中声明 vector 以便每次 while go 循环时它都会被重置。
尝试在 while 循环之前声明向量