Как проверить, проанализировал ли оператор stringstream неверный тип и пропустил ли он
Я заинтересован в обсуждении методов использованияstringstream
разобрать строку с несколькими типами. Я бы начал с рассмотрения следующей строки:
"2.832 1.3067 nana 1.678"
Теперь давайте предположим, что у меня есть длинная линия, которая имеет несколькоstrings
а такжеdoubles
, Очевидный способ решить эту проблему - токенизировать строку и затем проверять конвертацию каждой. Я заинтересован в том, чтобы пропустить этот второй шаг и использоватьstringstream
непосредственно, чтобы найти только номера.
Я решил, что хороший способ приблизиться к этому - прочитать строку и проверить,failbit
было установлено, что будет, если я попытаюсь разобрать строку в двойном.
Скажем, у меня есть следующий код:
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
и разобрать следующий номер?