您可以使用 std::getline(stream, stringToReadInto, demeter)。
我个人使用我自己的函数,其中包含一些附加功能,如下所示:
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 是一个函数指针(实际上是 std::function 允许仿函数和 lambda 支持),用于一个函数,该函数采用一个字符并返回一个布尔值。它可以像这样使用:
StringList results = String::Seperate(" Meow meow , Green, \t\t\nblue\n \n, Kitties!", ',' /* delimeter */, DefaultFlags, is_whitespace);
并会返回结果:{"Meow meow", "Green", "blue", "Kitties!"}
保留“喵喵”的内部空白,但删除变量周围的空格、制表符和换行符,并以逗号分隔。
(CV_IS 是一个仿函数对象,用于匹配特定字符或作为字符串文字的特定字符集合。我还有 CV_AND 和 CV_OR 用于组合字符验证器函数)
对于字符串文字,我只需将其放入 std::string() 中,然后将其传递给函数,除非需要极高的性能。打破分隔符很容易自己滚动 - 上述功能只是根据我的项目的典型用法和要求定制的,但您可以随意修改它并为自己声明。