Cómo probar si el operador de secuencia de cadena >> ha analizado un tipo incorrecto y omitirlo

Estoy interesado en discutir métodos para usarstringstream para analizar una línea con múltiples tipos. Comenzaría mirando la siguiente línea:

"2.832 1.3067 nana 1.678"

Ahora supongamos que tengo una línea larga que tiene múltiplesstrings ydoubles. La forma obvia de resolver esto es tokenizar la cadena y luego verificar la conversión de cada uno. Estoy interesado en omitir este segundo paso y usarstringstream directamente para encontrar solo los números.

Pensé que una buena manera de abordar esto sería leer la cadena y verificar sifailbit se ha establecido, lo que será si trato de analizar una cadena en un doble.

Digamos que tengo el siguiente código:

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;
 }

Imprimirá lo siguiente:

2.832
1.3067
Failed!
0
Failed!
0

No me sorprende que no pueda analizar una cadena, perolo que está sucediendo internamente de tal manera que no puede borrar sufailbit y analizar el siguiente número?

Respuestas a la pregunta(5)

Su respuesta a la pregunta