Как проверить, проанализировал ли оператор 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 и разобрать следующий номер?

Ответы на вопрос(5)

Ваш ответ на вопрос