3

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

#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”时,程序完美运行。有谁知道向我解释发生了什么?为什么程序忽略偶数行?

4

2 回答 2

2

您正在阅读每个循环 2 行:

第一次:

getline(myfile, line);

第二次:

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

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

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

于 2013-05-20T01:14:07.617 回答
2

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

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];
于 2013-05-20T01:16:07.563 回答