std::copyのこと

[戻る]
よすむら 2006/06/16(金) 19:02:30
いつもお世話になります。

csv形式を読み、2次元vectorに格納したいのです。
以下はcsvとその出力ですが、データ無しカンマ区切りフィールドがあると、vectorに反
映されません。
どのようにすればよいでしょうか?

123, ,B
124,,A

の出力が、

Line0:123
Line0: 
Line0:B
--------
Line1:124
Line1:A

となります。

    typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
// load & build
    std::ifstream infile(strpath_.c_str());
    if ( !infile.is_open() )
        return;
    boost::char_separator<char> sep(",");
    string strline;
    vector<vector<string> > vvec;
    vector<string> vec;
    while(std::getline(infile, strline)) {
        if ( strline.size() != 0 ) {
            tokenizer tok(strline, sep);
            std::copy(tok.begin(), tok.end(), back_inserter(vec));
            vvec.push_back(vec);
        }
    }
    infile.close();
// check data
    vector<vector<string> >::const_iterator it = vvec.begin();
    int i = 0;
    while (it != vvec.end()){
        vector<string>::const_iterator itin = (*it).begin();
        while(itin != (*it).end()) {
            std::cout << "Line" << i << ":" << *itin++ << std::endl;
        }
        std::cout << -------- << std::endl;
        *it++;
        i++;
    }

よろしくお願い申し上げます。

reshia 2006/06/16(金) 22:53:35
というか、これはstd::copyじゃなくて、boostが原因。
以下のコードで再現します。

    string str1 = "123, ,B";
    string str2 = "124,,A";

    typedef boost::tokenizer<
        boost::char_separator<char>
    > tokenizer;
    boost::char_separator<char> sep(",");
    tokenizer tok1(str1, sep);
    tokenizer tok2(str2, sep);

    cout << str1 << endl;
    for (boost::tokenizer<boost::char_separator<char>>::iterator beg = 
tok1.begin(); beg != tok1.end(); ++beg) {
        cout << *beg << endl;
    }

    cout << endl;

    cout << str2 << endl;
    for (boost::tokenizer<boost::char_separator<char>>::iterator beg = 
tok2.begin(); beg != tok2.end(); ++beg) {
        cout << *beg << endl;
    }

reshia 2006/06/16(金) 23:13:51
解決方法も調べてみました。

boostのchar_separator<char>のコンストラクタ第3引数に
     boost::keep_empty_tokens
を指定してやります。

第2引数は、今回の場合、不要なのでNULLでも渡せばいいと思います。

よすむら 2006/06/17(土) 16:03:59
[[解決]]
reshia様
すばやいご回答大変ありがとうございました。

boostだったんですね、見当違いをしておりました。
std::replace_copy_if辺りを探しておりましたので...。
今後ともよろしくお願い申し上げます。

古いスレッドには追加発言できません。