2012-01-12 21 views
0

のArrayに私はかなりの数のテキスト・ツー・アレーの質問がそこにある知っているが、私は私にそれらをマッチングに苦労しています。C++読書vec4

私はC++が得意ではないですが、私のOpenGLのプログラミングのためにそれを使用する必要があります。

は基本的に私は(vec4がCOORDシステムのためだけに4「ポイント」である)vec4の配列をした、と私は、テキストファイルにそれらをプリントアウト。そう(それは常に1であるので、私は最後の点を解消し、私は後でテキストファイルを読み込むときに、私はそれを追加することもできます考え出し)のようなファイルが読み込み:

(0.26, 0385, 0.48) 

(0.27, 0386, 0.47) 

(0.28, 0387, 0.46) 

(0.29, 0388, 0.45) 

だから、すべての行が1 ENDLによって分離されています。

今私は、このテキストファイルを読み込み、vec4配列に戻ってそれを作りたいです。 '('、 '、'、 ')'を避けるためにこれを行う最も簡単な方法は何ですか?私はおそらく、これらの不要な文字を除外するために巨大な長いネストされたif/elseを書くことができますが、それは非常に非効率的で、そこにいる誰かがよりスマートな方法を持っていることを確信します。

提案がありますか?助けて?

ありがとうございます!

答えて

4

まあ、形式は次のようであることが絶対に確実である場合、あなたは、標準的なラインベースの入力イディオムでここに埋め込まれた素朴な解析を行うことができます。

#include <fstream> // for std::ifstream 
#include <sstream> // for std::istringstream 
#include <string> // for std::string and std::getline 
#include <vector> // for std::vector 
#include <tuple>  // for std::tuple 

int main() 
{ 
    std::ifstream infile("thefile.txt"); 
    std::string line; 

    std::vector<std::tuple<double, double, double, double>> points; 

    while (std::getline(infile, line)) 
    { 
     std::istringstream iss(line); 
     double d1, d2, d3; 
     char c1, c2, c3; 

     if ((iss >> c1 >> d1 >> c2 >> d2 >> c3 >> d3) && 
      (c1 == '(' && c2 == ',' && c3 == ',')  ) 
     { 
      points.emplace_back(d1, d2, d3, 1.0); 
     } 
     else 
     { 
      // error processing this line 
     } 
    } 
} 

発生する可能性があります2つのエラーがありますlineのいずれかが必要なトークンに解析できないか、または区切り文字が期待どおりでないことを確認してください。どのようにそれを処理するかはあなた次第です。

さらに柔軟性が必要な場合は、各行を<regex>で処理するか、Boost.Qiのようなはるかに強力な一般的なパーサーを書くこともできます(間違いは残念ですが)。

+0

編集していただきありがとうございます。私のテキストファイルをコードブロックに入れるべきかどうかはわかりませんでした:) そして私はこの方法を試みます。これはテスト目的のためだけであり、私はそれを作っているので、テキストがこのようにフォーマットされることを知っています。 – user1144605

0

あなたは文字列にこれらの行を読む必要があります。 『』と 『)』「」あなたが交換するreplace機能を使用することができhttp://www.cplusplus.com/reference/string/string/

と:だから、あなたは文字列にラインを読んだことが、あなたはここで文字列関数を見て、あなたが一番合ったものを選ぶことができると仮定するとそれがあなたの望むものなら。これを行うと、3つの値をスペースで区切ったままになります。

+0

まともに十分な計画のように聞こえるおかげDivya、。 charをcharで調べてその値と比較するよりもはるかに良い音を置き換えてください。テキストファイルを、カンマなしで ")"のない各行に1つの浮動小数点値(例:0.385)に変更すると、その場合に浮動小数点として読み込むにはどうすればよいでしょうか?再度、感謝します。 – user1144605

+0

文字列に値を読み込み、その値を文字列からdoubleに変換するために 'atof'を使うことができます。次に、ダブルをキャストしてフロートすることができます。 http://www.cplusplus.com/reference/clibrary/cstdlib/atof/ – Divya

関連する問題