Я вижу, вы уже используете boost
. Вы обязательно должны попробовать boost.spirit.qi
для этой цели.
#include <vector>
#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>
namespace qi = ::boost::spirit::qi;
template <typename Iterator>
bool parse_numbers(Iterator & first, Iterator last, std::vector<double> & v)
{
using qi::double_;
using qi::phrase_parse;
using qi::_1;
using boost::spirit::ascii::space;
return phrase_parse(first, last, ('[' >> double_ % ',' >> ']'), space, v);
}
int main()
{
std::string s = "[ 0.0125, 2.9518e+02, 1.2833e+00, -3.5302e-04, 1.2095e+01, 1.0858e-01, 1.2112e-04, 1.1276e+03 ] # comments";
std::vector<double> v;
std::string::iterator sb = s.begin();
parse_numbers(sb, s.end(), v);
std::cout << "Parsed numbers:" << std::endl;
for (int i = 0; i < v.size(); ++i) std::cout << v[i] << std::endl;
std::cout << "Rest of line:" << std::endl;
std::cout << std::string(sb, s.end()) << std::endl;
}
Я взял функцию parse_numbers()
из документации spirit
и немного ее адаптировал. Он возвращает false , когда синтаксический анализ не удался (т. Е. Не правильно сформированный список), но возвращает true , когда в строке есть какой-либо текст после списка: первый итератор (sb
in main()
) будет указывать, где закончился список номеров.
См. Полную документацию здесь:
http://www.boost.org/doc/libs/1_46_1/libs/spirit/doc/html/spirit/qi.html