std :: getline(stream、stringToReadInto、delimeter)を使用できます。
私は個人的に、次のようないくつかの追加機能が組み込まれた独自の関数を使用しています。
StringList Seperate(const std::string &str, char divider, SeperationFlags seperationFlags, CharValidatorFunc whitespaceFunc)
{
return Seperate(str, CV_IS(divider), seperationFlags, whitespaceFunc);
}
StringList Seperate(const std::string &str, CharValidatorFunc isDividerFunc, SeperationFlags seperationFlags, CharValidatorFunc whitespaceFunc)
{
bool keepEmptySegments = (seperationFlags & String::KeepEmptySegments);
bool keepWhitespacePadding = (seperationFlags & String::KeepWhitespacePadding);
StringList stringList;
size_t startOfSegment = 0;
for(size_t pos = 0; pos < str.size(); pos++)
{
if(isDividerFunc(str[pos]))
{
//Grab the past segment.
std::string segment = str.substr(startOfSegment, (pos - startOfSegment));
if(!keepWhitespacePadding)
{
segment = String::RemovePadding(segment);
}
if(keepEmptySegments || !segment.empty())
{
stringList.push_back(segment);
}
//If we aren't keeping empty segments, speedily check for multiple seperators in a row.
if(!keepEmptySegments)
{
//Keep looping until we don't find a divider.
do
{
//Increment and mark this as the (potential) beginning of a new segment.
startOfSegment = ++pos;
//Check if we've reached the end of the string.
if(pos >= str.size())
{
break;
}
}
while(isDividerFunc(str[pos]));
}
else
{
//Mark the beginning of a new segment.
startOfSegment = (pos + 1);
}
}
}
//The final segment.
std::string lastSegment = str.substr(startOfSegment, (str.size() - startOfSegment));
if(keepEmptySegments || !lastSegment.empty())
{
stringList.push_back(lastSegment);
}
return stringList;
}
ここで、'StringList'はstd:: vectorのtypedefであり、CharValidatorFuncは、1つのcharを受け取り、boolを返す関数の関数ポインター(実際には、ファンクターとラムダのサポートを可能にするstd :: function)です。次のように使用できます。
StringList results = String::Seperate(" Meow meow , Green, \t\t\nblue\n \n, Kitties!", ',' /* delimeter */, DefaultFlags, is_whitespace);
そして、結果を返します:{"Meow meow"、 "Green"、 "blue"、 "Kitties!"}
'Meow meow'の内部空白を保持しますが、変数を囲むスペースとタブおよび改行を削除し、コンマで分割します。
(CV_ISは、文字列リテラルとして取得された特定の文字または文字の特定のコレクションを照合するためのファンクターオブジェクトです。文字検証関数を組み合わせるためのCV_ANDおよびCV_ORもあります)
文字列リテラルの場合、極端なパフォーマンスが必要な場合を除いて、std :: string()に入れてから、関数に渡します。デリメータを壊すのはかなり簡単です-上記の関数は私のプロジェクトの典型的な使用法と要件に合わせてカスタマイズされていますが、自由に変更して自分で主張してください。