C++ 从OBJ文件C++;
我正在尝试读取以下OBJ文件C++ 从OBJ文件C++;,c++,input,object-files,C++,Input,Object Files,我正在尝试读取以下OBJ文件 #--- 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 . . . 我正在尝试设置一个函数,该函数将顶点的值(字符v后面的3个值)存储到点向量(Pt由x、y和z组成)和面的值(字符f后面的3个值)存储到另一个面向量(面由3个整数组成)。到目前为止,我已尝试使用以下功能: void readFi
#--- 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
.
.
.
我正在尝试设置一个函数,该函数将顶点的值(字符v后面的3个值)存储到点向量(Pt由x、y和z组成)和面的值(字符f后面的3个值)存储到另一个面向量(面由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;
}
}
void readFile(char*infle)
{
ifstream-inF(infle);
弦线;
while(getline(inF,line))
{
如果(第[0]行=='v')
{
浮动x,y,z;
inF>>x>>y>>z;
//cout>x>>y>>z;
面。向后推(面(x,y,z));
}
else if(第[0]行='#')
继续;
}
}
每当我通过在第一个if语句中显示x值来测试这个方法时,我都会得到值“-858993460”。如何修复此函数?cout行的位置被注释掉。例如,您可以使用assimp()来代替编写自己的obj文件读取器 关于代码:在访问索引0处的字符串之前,应该检查行是否为空。 然后,在读取浮点值时,必须首先跳过行中的字符(对于顶点为“v”)。例如,您可以将其读入一个伪char变量。 最后,>>更改输入流的状态。例如,您可以使用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";
}
if(line.empty())
继续;
如果(第[0]行=='v')
{
浮动x,y,z;
模拟字符;
std::stringstream ss(线路);
ss>>假人>>x>>y>>z;
cout-858993460
是十六进制的0xCCCC
。这是Visual Studio附带的CRT调试版本分配给未初始化数据的模式。因为我们无法确定如何“在第一个if语句中显示x值”,我们无法帮助您,也无法提供解释。我将cout放在了测试cout的位置。此外,测试所有值是否已成功存储的最佳方法是什么?解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。在至少,您应该[编辑]您的问题包括一个重现您的问题的示例,以及您在调试器中所做的观察。为什么要将第一个字符读入一个伪字符,而不是将其读入一个适当的char
变量,并将其用作开关
/大小写
语句的输入?检查char可以将浮点值保存为v或整数保存为f,以便在将来的计算中使用。我需要区分不同的值集。我想展示如何在没有太多更改的情况下运行代码。如果我要实现这一点,我不会使用stringstreams之类的东西,而是要实现一个简单的解析器(FSM)因此也会在行的第一个字符上分支。