Gestione delle stringhe in C++
Articolo scritto da Stefano Cancedda
Pagina 3 di 3
Pagina 3 di 3
Uso degli stream in input
Analogamente al caso dell'operatore di output è possibile effettuare le operazioni di input, sono supportate tutte le conversioni di dato precedenti, stavolta nella direzione inversa. Il seguente esempio sintetico illustra le funzionalità principali.
stringstream s1, s2, s3;
int raggio; float pigreco, stefano;
s1 << "10";
s2 << "3.14";
s3 << "stefano è bello";
//Assegna alla variabile raggio il valore intero 10
s1 >> raggio;
//Assegna alla variabile prezzo il valore decimale 3.14
s2 >> pigreco;
//Verifica errore in lettura
s3 >> stefano;
if (!s3) printf("errore");
Analogie sintattiche con I/O standardLo standard input e lo standard output, sono nella quasi totalità dei casi affidati rispettivamente all'acquisizione dati da tastiera ed alla visualizzazione sul monitor. Nel caso delle applicazioni console è possibile gestire il tutto per mezzo degli stream.
Il C++ mette a disposizione i due stream speciali cin e cout tramite la libreria <iostream>. La sintassi è formalmente identica a quella degli stringstream.
Esempi:
char c; cin >> c; // legge un carattere da tastiera cout << c // stampa sul monitor il carattereGestione dei formati
Altra caratteristica utilissima degli stream è la gestione diretta dei formati.
width si applica all'istruzione di scrittura seguente e definisce il minimo numero di caratteri da impiegare
stringstream s; s.width(5); s << "SC"; //risultato s: [] [] [S] [C]precision definisce invece il numero massimo di caratteri da impiegare, si applica a numeri decimali
stringstream s; s.precision(3); s << '3.1415'; //risultato s: 3.14alcuni caratteri speciali sono identificati da manipolatori senza argomento:
stringstream s; s << endl; // append del carattere '/n' s << ends; // append del terminatore '/0'Sono immediate le conversioni di base:
stringstream s; s << dec << num; // converte num in base 10 (decimale) s << hex << num; // converte num in base 16 (esadecimale) s << oct << num; // converte num in base 8 (ottale)Gestione degli errori
In C++ le operazioni di I/O non generano mai eccezioni (in altri linguaggi come il Java avviene esattamente l'opposto). Questo implica che il programmatore deve testare esplicitamente il risultato di ogni operazione critica.
Una serie di flag predefiniti registrano lo stato dello stream.
- goodbit: vale true se non ci sono errori
- badbit: vale true se si è verificato un errore che ha causato la perdita di dati
- eofbit: vale true se è stata raggiunta la fine del file
- failbit: vale true se se si è verificato un errore che NON ha causato la perdita di dati (ad esempio un errore di formato)
stringstream s; s << variabile_magica; if (s.badbit) cout << "Errore gravissimo!";
');







