web-dev-qa-db-ja.com

C ++ Boost Split String

私は_boost::split_メソッドを使用して、文字列を次のように分割しています:

_boost::split_にアクセスするには、まず正しいヘッダーを含めるようにします。

_#include <boost/algorithm/string.hpp>
_

その後:

_vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));
_

そして線は

_"test   test2   test3"
_

これは私が結果の文字列ベクトルを消費する方法です:

_void printstrs(vector<string> strs)
{
    for(vector<string>::iterator it = strs.begin();it!=strs.end();++it)
    {
        cout << *it << "-------";
    }

    cout << endl;
}
_

しかし、なぜstrsで_"test2"_と_"test3"_しか取得できません。_"test"_、_"test2"_、_"test3"_であってはなりません。文字列の_\t_(タブ)。

2011年4月24日更新:printstrsでコードを1行変更した後、最初の文字列が表示されたようです。私が変更され

_cout << *it << "-------";
_

_cout << *it << endl;
_

そして、_"-------"_が何らかの形で最初の文字列をカバーしているように見えました。

48
icn

これは機能するため、問題はコードのどこかにあります。

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;    
for (size_t i = 0; i < strs.size(); i++)
    cout << strs[i] << endl;

また、ベクトルイテレータを使用するアプローチのテストも機能します。

string line("test\ttest2\ttest3");
vector<string> strs;
boost::split(strs,line,boost::is_any_of("\t"));

cout << "* size of the vector: " << strs.size() << endl;
for (vector<string>::iterator it = strs.begin(); it != strs.end(); ++it)
{
    cout << *it << endl;
}

繰り返しますが、あなたの問題は別の場所にあります。たぶんあなたは\t文字は文字列にありますが、そうではありません。ベクターの挿入を監視して、想定どおりにすべてが挿入されていることを確認することから始めて、コードをデバッグで埋めます。

出力:

* size of the vector: 3
test
test2
test3
69
karlphillip

-----で最初の結果をカバーするのに問題があった理由についての私の最も良い推測は、実際にファイルから入力行を読み取ることです。その行にはおそらく最後に\ rがあったので、次のような結果になりました。

-----------test2-------test3

起こったのは、実際にマシンがこれを印刷したことです:

test-------test2-------test3\r-------

つまり、test3の終わりの改行のため、test3の後のダッシュは最初のWordの上部に印刷されます(testとtest2の間の既存のダッシュのいくつかは、あなたはそれらがすでにダッシュ)。

12
james