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);

2回目:

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

したがって、データの半分を破棄しています。

解決策:関数を使用してifstream::peek、行が で始まるかどうかを確認してみてください'v'。その後、すべての値を変数に読み込みます。

于 2013-05-20T01:14:07.617 に答える
2

コメントで述べたように、次の 1 行を読みます。

getline (myfile,line);

行がv最初の位置にある場合は、次のステートメントで別の行を読み取ります。

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

ただし、 で読み取った前の行を処理しないgetlineため、その行が失われます。line考えられる解決策の 1 つは、以下を使用して一致するそれぞれを処理することistringstraeamです。

std::istringstream iss( line );
iss >> v >> valuesX[n]>> valuesY[n]>> valuesZ[n];
于 2013-05-20T01:16:07.563 に答える