2012-03-19 31 views
2

私はC++でファイルを読んでいます。私がC++形式の入力は値と一致する必要があります

何で撮影されていますが行わ must_be()の引数と、 var1=2345, var2=3425, var3=3457と一致しない場合、すべてが吹くまで
input>>must_be("tag1")>>var1>>must_be("tag2")>>var2>>must_be("tag3")>>var3; 

のようなものを持っていると思い

tag1 2345 
tag2 3425 
tag3 3457 

:ファイルは次のようになります。

標準的な方法はありますか? (うまくいけば、 "tag1"は必ずしも文字列である必要はありませんが、これは必須条件ではありません)fscanf Cからかなり簡単になりました。

ありがとうございます!

>>は、空白で区切られた1組の文字をinputから読み込みます。文字列(tagX)の一部を、指定した文字列またはデータと照合したい。

答えて

0

クラスにはoperator>>を実装する必要があります。このような何か:

#include <string> 
#include <iostream> 
#include <fstream> 
#include <sstream> 

struct A 
{ 
    A(const int tag_):tag(tag_),v(0){} 

    int tag; 
    int v; 
}; 

#define ASSERT_CHECK(chk, err) \ 
     if (!(chk)) \ 
      throw std::string(err); 

std::istream& operator>>(std::istream & is, A &a) 
{ 
    std::string tag; 
    is >> tag; 
    ASSERT_CHECK(tag.size() == 4, "tag size"); 
    std::stringstream ss(std::string(tag.begin()+3,tag.end())); 
    int tagVal; 
    ss >> tagVal; 
    std::cout<<"tag="<<tagVal<<" a.tag="<<a.tag<<std::endl; 
    ASSERT_CHECK(a.tag == tagVal,"tag value"); 

    is >> a.v; 
    return is; 
} 

int main() { 
    A a1(1); 
    A a2(2); 
    A a3(4); 

    try{ 
     std::fstream f("in.txt"); 
     f >> a1 >> a2 >> a3; 
    } 
    catch(const std::string &e) 
    { 
     std::cout<<e<<std::endl; 
    } 

    std::cout<<"a1.v="<<a1.v<<std::endl; 
    std::cout<<"a2.v="<<a2.v<<std::endl; 
    std::cout<<"a3.v="<<a3.v<<std::endl; 
} 

は(タグ多くの試合を意味する)間違ったタグ値のために、例外がスローされることに注意してください。

+0

しかし、あなたはこれを行うの標準(ライブラリ/ブースト)方法を知っていますか? – Richard

+0

@リチャードこれは標準的なやり方です。あなたのクラスのために 'operator >>'を実装するだけでよいのです。 boostはカスタムクラスのoperator >>を提供しません –

0

行ごとに行を読み込むことはできず、行ごとに一致するタグはありませんか?タグが期待どおりに一致しない場合は、行をスキップして次の行に進むだけです。

このような何か:

const char *tags[] = { 
    "tag1", 
    "tag2", 
    "tag3", 
}; 
int current_tag = 0; // tag1 
const int tag_count = 3; // number of entries in the tags array 

std::map<std::string, int> values; 

std::string line; 
while (current_tag < tag_count && std::getline(input, line)) 
{ 
    std::istringstream is(line); 

    std::string tag; 
    int value; 
    is >> tag >> value; 

    if (tag == tags[current_tag]) 
     values[tag] = value; 
    // else skip line (print error message perhaps?) 

    current_tag++; 
} 
+0

これを行う標準(ライブラリ/ブースト)の方法を知っていますか? – Richard

+0

@リチャードおそらく[Boost.spirit](http://www.boost.org/doc/libs/1_49_0/libs/spirit/doc/html/index.html)? –

関連する問題