私は_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;
_
そして、_"-------"
_が何らかの形で最初の文字列をカバーしているように見えました。
これは機能するため、問題はコードのどこかにあります。
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
-----で最初の結果をカバーするのに問題があった理由についての私の最も良い推測は、実際にファイルから入力行を読み取ることです。その行にはおそらく最後に\ rがあったので、次のような結果になりました。
-----------test2-------test3
起こったのは、実際にマシンがこれを印刷したことです:
test-------test2-------test3\r-------
つまり、test3の終わりの改行のため、test3の後のダッシュは最初のWordの上部に印刷されます(testとtest2の間の既存のダッシュのいくつかは、あなたはそれらがすでにダッシュ)。