Во-первых, простите за плохой английский. Я пытаюсь прочитать значения файла .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». Когда я читаю непосредственно значение переменной «строка», результат остается тем же. Тем не менее, когда я удаляю строку, которая присваивает значения переменным «value», и считываю переменную «line» напрямую, программа работает отлично. Кто-нибудь знает, объясните мне, что происходит? Почему программа игнорирует четные строки?
Как я уже упоминал в моем комментарии, вы читаете одну строку с:
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];
Вы читаете 2 строки за цикл:
Первый раз:
getline(myfile, line);
Второй раз:
myfile >> v >> valuesX[n] >> valuesY[n] >> valuesZ[n];
Таким образом, вы отбрасываете половину своих данных.
Решение: Попробуйте использовать ifstream::peek
функция, чтобы увидеть, начинается ли строка с 'v'
, тогда вы бы прочитали все значения в ваши переменные.