首先,抱歉英语不好。好吧,我正在尝试读取.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”的行时,程序运行正常。任何人都知道向我解释发生了什么?为什么程序忽略偶数行?
答案 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];