Non è un compito semplice per i flussi di input in C++ fare la stessa cosa. La funzione scanf
ottiene tutto il formato previsto: "%d %*s %d"
e può guardare avanti per determinare cosa sta succedendo.
D'altra parte, l'operatore >>
tenta semplicemente di soddisfare il parametro di immissione corrente.
Hai la possibilità di scrivere il tuo manipolatore istream per mangiare gli input fino a raggiungere una cifra.
Prova questa mio codice ingenuo:
template<typename C, typename T>
basic_istream<C, T>&
eat_until_digit(basic_istream<C, T>& in)
{
const ctype<C>& ct = use_facet <ctype<C>> (in.getloc());
basic_streambuf<C, T>* sb = in.rdbuf();
int c = sb->sgetc();
while (c != T::eof() && !ct.is(ctype_base::digit, c))
c = sb->snextc();
if (c == T::eof())
in.setstate(ios_base::eofbit);
return in;
}
int main()
{
int first, second;
cin >> first >> eat_until_digit >> second;
cout << first << " : " << second << endl;
}
È possibile estendere e migliorare sopra codice per ottenere quello che ti serve.
+1 Suoni ragionevoli! ^^ E che dire un insieme di salti, come 'std :: ios :: skip :: str',' std :: ios :: skip :: dec', e anche 'std :: ios :: skip :: any'? Troppo disordinato? (: – Rubens
@Rubens: vedere la mia risposta aggiornata, seconda parte. – deepmax
Non 'std :: ctype :: scan_is' fare questo? – 0x499602D2