Используя немного Boost Духа, вы можете использовать одну строку:
if (tmp_stream >> std::noskipws >>
qi::phrase_match((+qi::double_) % qi::eol, qi::blank, data))
{
и еще одну строку, чтобы отобразить результаты в виде бонуса:
std::cout << karma::format((karma::double_ % ", ") % karma::eol, data) << "\n";
}
Примечание It руды inf
, -inf
, nan
:)
S и ее это Live on Coliru:
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi_match.hpp>
namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;
int main()
{
std::vector<std::vector<double>> data;
std::stringstream tmp_stream(
"123 45 inf -inf nan .7e-99\n"
"42\n"
"-1");
if (tmp_stream >> std::noskipws >> qi::phrase_match((+qi::double_) % qi::eol, qi::blank, data))
{
std::cout << karma::format((karma::double_ % ", ") % karma::eol, data) << "\n";
}
}
UPDATE Слегка адаптированного к вашей входной грамматике, я предлагаю разбор в вектор пара вместо:
#include <boost/fusion/adapted/std_pair.hpp> // handle std::pair
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/qi_match.hpp>
namespace qi = boost::spirit::qi;
namespace karma = boost::spirit::karma;
int main()
{
std::vector<std::pair<double, double>> data;
std::stringstream tmp_stream("{ (132.181,0.683431), (136.886,0.988517), (137.316,0.504297), (133.653,0.602269), (150.86,0.236839) }");
if (tmp_stream >> std::noskipws >> qi::phrase_match(
'{'
>>
('(' >> qi::double_ >> "," >> qi::double_ >> ')')
% ','
>> '}',
qi::space, data))
{
std::cout << karma::format(karma::delimit(" ") [karma::auto_] % karma::eol, data) << "\n";
}
}
который печатает: (см Live On Coliru
132.181 0.683
136.886 0.989
137.316 0.504
133.653 0.602
150.86 0.237
Примечания Чтобы сделать вещи быстрее, рассмотреть не разбор образует поток, но с использованием
streambuf_iterator
- основополагающих данные байт, если у вас в памяти в любом случае
Вы собираетесь иметь чтобы показать нам ваш код data_parser. –
Почему бы не использовать std :: pair? –
UldisK
Не уверен, что это связано с вопросом, но если вы всегда будете работать с парами парных чисел, вероятно, было бы гораздо более эффективно использовать 'std :: vector>' для хранения , –
icabod