Мне интересно обсуждать методы использования stringstream
для разбора строки с несколькими типами. Я бы начал с рассмотрения следующей строки:
"2.832 1.3067 nana 1.678"
Теперь предположим, что у меня длинная строка с несколькими strings
и doubles
. Очевидным способом решить эту проблему является токенизация строки, а затем проверка конвертации каждой из них. Мне интересно пропустить этот второй шаг и использовать stringstream
непосредственно, чтобы найти числа.
Я решил, что хороший способ приблизиться к этому - это прочитать строку и проверить, был ли установлен failbit
, что будет, если я попытаюсь разобрать строку в double.
Скажем, у меня есть следующий код:
string a("2.832 1.3067 nana 1.678");
stringstream parser;
parser.str(a);
for (int i = 0; i < 4; ++i)
{
double b;
parser >> b;
if (parser.fail())
{
std::cout << "Failed!" << std::endl;
parser.clear();
}
std::cout << b << std::endl;
}
Он выведет следующее сообщение:
2.832
1.3067
Failed!
0
Failed!
0
Я не удивлен, что ему не удается проанализировать строку, но , что происходит внутри, так что не удается очистить ее failbit
и проанализировать следующий номер?