2009-09-10 38 views
5

ストリーム入力演算子(演算子>>)をオーバーロードして単純なテキスト書式でデータを解析する方法の良い例を探しています。私はthis tutorialを読みましたが、もう少し進んだことをしたいと思います。私の場合、私はチェックしたい(そして無視する)文字列を固定しています。リンクから2次元のポイントフォーマットを仮定すると、より多くのようになりました。意図した効果は、0.3と0.4の数値を解析することです。 (はい、これは非常に愚かな構文ですが、必要ないくつかのアイデアが組み込まれています)。ほとんどの場合、私はちょうど、適切に固定文字列が存在するかどうかをチェックする方法を参照して空白を無視する、などC++抽出演算子のオーバーロードの例>>データの解析

更新したい: おっと、私は以下の作られたコメントがこのサイトを使用して私の最初の時間です(何のフォーマットを持っていません)。 私は空白が私が持っている

std::cin >> std::ws; 

好きな文字列を食べるために何かをスキップすることができることを見出し

static bool match_string(std::istream &is, const char *str){ 
    size_t nstr = strlen(str); 
    while(nstr){ 
     if(is.peek() == *str){ 
      is.ignore(1); 
      ++str; 
      --nstr; 
     }else{ 
      is.setstate(is.rdstate() | std::ios_base::failbit); 
      return false; 
     } 
    } 
    return true; 
} 

の位置(行番号)を取得することができるように、それはいいだろう解析エラーです。

更新2: 1文字の先読みだけを使用して、行番号とコメント解析が機能しました。最終結果は、ここではAArray.cppで、関数parse()で見ることができます。このプロジェクトは、直列化可能なC++ PHPのような配列クラスです。

+0

"抽出"または "ストリーム入力"演算子ではなく、 "ビットシフト"演算子です。ストリームIOバージョン自体は、実際にはほとんど使用されていないオリジナルのC演算子のオーバーロードされたバージョンです。 –

+1

Chris:私はあなたに同意しませんが、 ">>"と "<<"演算子を独立して "ストリーム入出力"演算子と呼ぶことは受け入れられているようです。 – GRB

+1

@GRB:演算子のオーバーロードはありません。ビットごとの右シフト演算子は、C++ stlによって悪用されています。 演算子^を考慮してください。演算子のオーバーロードを使用して、raise-to-the-power演算子にすることができます。しかし、それは単純に間違った優先順位と結合性を持っています。新規の演算子を追加することができず、既存の演算子のセマンティクスを変更することはできず、用語に暗黙のある機械用語:「オーバーロード」、演算子>>はビット単位の右シフト演算子であり、その他はすべてオーバーロードされた形式。 –

答えて

1

演算子>>(istream &、オブジェクト&)は、入力ストリームから、書式付きおよび/または書式なしの抽出関数を使用してデータを取得し、オブジェクトに格納する必要があります。

ファッションの後でもっと安全にしたい場合は、開始する前にistream :: sentryオブジェクトを構築してテストしてください。構文エラーが発生した場合は、setstate(ios_base::failbit)に電話して、my_stream.clear()を呼び出すまで他の処理を行わないようにすることができます。

例については<istream>(SGI STLを使用している場合はistream.tcc)を参照してください。

関連する問題