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?