使用C ++从.OBJ文件中读取和存储值

时间:2013-05-20 01:04:55

标签: c++ .obj

首先,抱歉英语不好。好吧,我正在尝试读取.OBJ文件的值(参见here)并使用该程序将它们存储在变量中:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
string line;
string v, valuesX[8], valuesY[8], valuesZ[8];
int n = 0;

ifstream myfile ("cubo.obj");
while(!myfile.eof())
{
    getline (myfile,line);
    if (line[0] == 'v')
    {
        myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];
        cout << valuesX[n] << "\t" << valuesY[n] << "\t" << valuesZ[n] << endl;
        n++;
    }
}
return 0;
}

该文件只是一个简单的立方体,由Blender导出。我希望他向我展示以“v”开头的所有行,但结果只显示奇数“v”行。当我直接读取变量“line”的值时,结果是相同的。但是,当我删除为变量“value”赋值并直接读取变量“line”的行时,程序运行正常。任何人都知道向我解释发生了什么?为什么程序忽略偶数行?

2 个答案:

答案 0 :(得分:2)

你每个循环读取2行:

第一次:

getline(myfile, line);

第二次:

myfile >> v >> valuesX[n] >> valuesY[n] >> valuesZ[n];

所以你丢弃了一半的数据。

解决方案:尝试使用ifstream::peek函数查看某行是否以'v'开头,然后您将所有值都读入变量。

答案 1 :(得分:1)

正如我在评论中提到的,你读了一行:

getline (myfile,line);

然后如果该行在第一个位置有v,则使用此语句读取另一行:

myfile >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];

但是您没有使用getline处理上一行读入,因此您将丢失该行。一种可能的解决方案是使用line处理匹配的每个istringstraeam

std::istringstream iss( line );
iss >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];