C++ 从OBJ文件C++;

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

我正在尝试读取以下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 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)因此也会在行的第一个字符上分支。