Ymmärsinkö oikein, että tuossa menee jokin pieleen? Muunto näyttäisi kuitenkin tapahtuvan kuten pitääkin.. Mitä minun pitäsi siis muuttaa tuosta?
#include <sstream> #include <string> #include <iostream> using namespace std; int main(){ string merkkijono = "152"; int numero; istringstream ss(merkkijono); ss >> numero; cout << numero << endl; if (! ss.good()) { cout << "jokin meni pieleen" << endl; } }
Laitoin noin, niin ei tullut mitään virhettä. :S
if (ss.fail()) { cout << "jokin meni pieleen" << endl; }
Kiitos vinkistä! Itse tuossa myös huomasin, että se taitaa vissiin olla eof-lippu joka asettuu..
Saman voi tehdä myös tutkimalla >>-operaation paluuarvoa.
#include <sstream> #include <string> #include <iostream> using namespace std; int main(){ string merkkijono = "152"; int numero; istringstream ss(merkkijono); if ( !(ss >> numero) ) { cout << "jokin meni pieleen" << endl; } else { cout << numero << endl; } }
Jep, tuo TsaTsaTsaan tapa taitaa olla järkevin.
TsaTsaTsaa kirjoitti:
Saman voi tehdä myös tutkimalla >>-operaation paluuarvoa.
... joka on viittaus olioon itseensä. Eihän virta >> a >> b
muuten toimisi. Vertailua ei siis tarvitse tehdä >>-operaattorin yhteydessä, vaan seuraava rivi käy aivan hyvin.
Seuraavat koodit tekevät aivan saman asian:
virta >> a >> b; if (virta.fail()) {}
virta >> a >> b; if (!virta) {}
if ((virta >> a >> b).fail()) {}
if (!(virta >> a >> b)) {}
Käänteiseen tulokseen pääsee ilman huutomerkkiä. Tällöin käytetään virran operaattoria, joka muuttaa sen osoittimeksi (void*
), joka taas muuttuu totuusarvoksi.
virta >> a >> b; if (virta) {} // if ((void*)virta != 0) {}
if (virta >> a >> b) {}
Aihe on jo aika vanha, joten et voi enää vastata siihen.