C ++ / Boost:编写更强大的sscanf替换
我想用C ++编写一个函数来替换C的sscanf,它将匹配分配给迭代器。
基本上,我想要的东西是:
string s = "0.5 6 hello";
std::vector<boost::any> any_vector;
sscanv(s, "%f %i %s", any_vector);
cout << "float: " << any_cast<float>(any_vector[0]);
cout << "integer: " << any_cast<integer(any_vector[1]);
cout << "string: " << any_cast<string>(any_vector[2]);
确切的细节可能会有所不同,但你明白了。 任何想法的实施?
迄今为止的选项以及迄今为止的问题:
那是什么?
void sscanf(std::string str,
const std::string& format,
std::vector<boost::any>& result)
{
std::string::const_iterator i = format.begin();
while (i != format.end())
{
if (*i == '%')
{
++i; // now *i is the conversion specifier
char specifier = *i;
++i; // now *i is the next seperator
std::string extract = str.substr(0, str.find(*i));
switch (specifier)
{
// matching an integer
case 'i':
result.push_back(boost::lexical_cast<int>(extract));
break;
// matching a floating point number
case 'a': case 'e': case 'f': case 'g':
result.push_back(boost::lexical_cast<float>(extract));
break;
// matching a single character
case 'c':
result.push_back(boost::lexical_cast<char>(extract));
break;
// matching a string
case 's':
result.push_back(extract);
break;
// Invalid conversion specifier, throwing an exception
default:
throw std::runtime_error("invalid conversion specifier");
break;
}
}
else
{
// if it's not a %, eat!
str.erase(0, str.find(*i)+1);
++i;
}
}
}
一些转换说明符丢失 - 但主要是它的工作原理。
如果你的格式字符串是在编译时确定的,那么写一些可变参数模板printf替换。 反转这些应该工作得很好。
然后你可以使用istream的>>操作符来读取,或者使用c-stdlib函数。
链接地址: http://www.djcxy.com/p/50831.html上一篇: C++/Boost: Writing a more powerful sscanf replacement
下一篇: ASP.NET MVC Display Template for strings is used for integers