2016-11-02 17 views
-1

からポイントで読む次OBJファイルで、私は読んしようとしているOBJファイルC++

#--- ObjWriter --- 
v -0.599972 -0.599972 -0.599972 
v -0.304591 -0.834531 0.539150 
. 
. 
. 
f 1 2 6 
f 1 6 5 
f 1 5 7 
. 
. 
. 

私はchar型のv次の頂点の値(3つの値を格納する機能を設定しようとしています)を、点のベクトル(Ptはax、y、zから構成されます)と面の値(char fの後の3つの値)から別の面のベクトル(Faceは3つのintで構成されます)これまでのところ、私は次の関数でこれを試みた:

void readFile(char *inFile) 
{ 
    ifstream inF(inFile); 
    string line; 

    while (getline(inF, line)) 
    { 
     if (line[0] == 'v') 
     { 
      float x, y, z; 
      inF >> x >> y >> z; 

      // cout << x; 

      verts.push_back(Pt(x, y, z)); 
     } 
     else if (line[0] == 'f') 
     { 
      int x, y, z; 
      inF >> x >> y >> z; 
      faces.push_back(Face(x, y, z)); 
     } 
     else if (line[0] == '#') 
      continue; 
    } 
} 

声明、私は値を取得する場合、私は最初のx値を表示することにより、このメソッドをテストするたびに「-858993460」。どうすればこの機能を修正できますか? cout行の配置はコメントアウトされています。

+0

'' -858993460'進で0xCCCCCCCC'です:このような

何か。これは、Visual Studioに付属しているCRTのデバッグバージョンが初期化されていないデータに割り当てるパターンです。 "最初のif文で*のx値を表示する" *の方法を使うことはできないので、私たちはあなたを助けたり説明を提供することはできません。 – IInspectable

+0

私はそれを試していたところに置いた。また、すべての値が正常に格納されたことをテストする最良の方法は何ですか? – JMV12

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

-1

代わりに、独自のOBJファイルリーダーを書くのあなたは、例えば、あなたのコードについて(http://www.assimp.org

をassimp使用することができますラインは読むとき、そして、インデックス0 で文字列にアクセスする前に、空であるかどうかをチェックする必要があり浮動小数点値の場合は、最初にラインから文字をスキップする必要があります(頂点の場合は「v」)。たとえば、ダミーのchar変数に読み込むことができます。 最後に>>は入力ストリームの状態を変更します。たとえば、ストリングストリームを使用して現在の行で初期化し、このストリームから読み込むことができます。

if(line.empty()) 
    continue; 

if (line[0] == 'v') 
{ 
    float x, y, z; 
    char dummy; 
    std::stringstream ss(line); 
    ss >> dummy >> x >> y >> z; 
    cout << x << ";" << y << ";" << z << "\n"; 
} 
+0

なぜ最初の文字を適切な 'char'変数に読み込む代わりにダミー文字に読み込み、それを' switch'/'case'文の入力として使うのですか? – IInspectable

+0

charをチェックすることで、vのfloatまたはfのintを将来の計算に使用することができます。私は値のセットを区別する必要があります。 – JMV12

+0

あまり変更を加えずにコードを実行する方法を示したかったのです。私がこれを実装するなら、私はstringstreamsとそのものを使用せず、単純なパーサー(FSM)を実装するので、その行の最初のcharで分岐します。 – Harry

関連する問題