Sono interessato a discutere i metodi per l'utilizzo di stringstream
per analizzare una riga con più tipi. Vorrei iniziare a guardare la seguente riga:Come verificare se l'operatore di stringstream >> ha analizzato un tipo errato e saltarlo
"2.832 1.3067 nana 1.678"
Ora lascia supporre ho una lunga serie che ha più strings
e doubles
. Il modo ovvio per risolvere questo è tokenize la stringa e quindi verificare la conversione di ciascuno. Sono interessato a saltare questo secondo passaggio e usare stringstream
direttamente per trovare solo i numeri.
Ho immaginato che un buon modo per avvicinarsi a questo sarebbe quello di leggere la stringa e controllare se è stato impostato il failbit
, che sarà se provo a analizzare una stringa in un doppio.
Dire che ho il seguente codice:
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;
}
Sarà stampare le seguenti:
2.832
1.3067
Failed!
0
Failed!
0
Non mi sorprende che non riesce ad analizzare una stringa, ma ciò che sta accadendo internamente tale che non riesce a cancellare il suo failbit
e analizzare il prossimo numero?
Controllare la mia risposta qui per favore: [C++ in movimento all'elemento successivo in un file.txt] (http://stackoverflow.com/a/24501035/1413395). Penso che sia rilevante. –
@ πάνταῥεῖ Ahhh, ok così si blocca al primo errore. –
@ πάνταῥεῖ Ho cancellato la richiesta. Dopo il tuo post suggerito ero abbastanza sicuro che fosse un duplicato. Ma se vuoi aggiungere una risposta che sarebbe grandiosa. –