std::copyのこと – プログラミング – Home

通知
すべてクリア

[解決済] std::copyのこと


よすむら
 よすむら
(@よすむら)
ゲスト
結合: 19年前
投稿: 22
Topic starter  

いつもお世話になります。

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
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

というか、これは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
 reshia
(@reshia)
ゲスト
結合: 20年前
投稿: 117
 

解決方法も調べてみました。

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

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


返信引用
よすむら
 よすむら
(@よすむら)
ゲスト
結合: 19年前
投稿: 22
Topic starter  

reshia様
すばやいご回答大変ありがとうございました。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました