Elementi di
programmazione
ad oggetti
a. a. 2009/2010
Corso di Laurea Magistrale in Ingegneria Elettronica
Docente: Mauro Mazzieri, Dipartimento di Ingegneria Informatica,
Gestionale e dell’Automazione
Lezione 9
Input/output e stream
Caratteri

I caratteri vengono rappresentati
come valori numerici

Una tabella di codifica permette di
associare valori numerici a caratteri
 ASCII
(7bit)
 ISO-8859

256 caratteri sono appena sufficienti per le lingue
europee
 Unicode


(31bit)
Transcodifica UTF-8
Transcodifica UTF-16
Libreria standard: string

La classe string della libreria standard
rappresenta sequenze di caratteri di
lunghezza arbitraria


string s;


typedef basic_string<char> string;
Costruttore di default, stringa vuota
string s(“buongiorno”)


Inizializza la stringa con una stringa costante
Una “stringa costante” è una stringa stile C,
non un oggetto della classe string

Array di const char
Dichiarazione di string nella
libreria standard
template<typename _Alloc> class
allocator;
template<class _CharT> struct
char_traits;
template<typename _CharT, typename
Traits = char_traits<_CharT>,
typename _Alloc = allocator<_CharT>>
class basic_string;
template<> struct char_traits<char>;
typedef basic_string<char> string;
template<> struct char_traits<wchar_t>;
typedef basic_string<wchar_t> wstring;
basic_string

template<typename _CharT,
typename _Traits, typename
_Alloc>
class basic_string

_CharT è il tipo del carattere



_Traits è un char_traits, specializzazione del
template template<typename _CharT>
struct char_traits



char
wchar_t (come char ma occupa due o più byte)
Definisce le operazioni elementari tra caratteri:
assegnamenti, conversioni, confronti, copie,
spostamenti, …
Nella libreria standard sono già definite le
specializzazioni per char e wchar_t
_Alloc è un allocatore
Membri di string
string s;
// …
s.empty()

true se s è vuota
s.size()


Dimensione (numero di caratteri)
Restituisce un size_type (unsigned)
operator[]




Il carattere in una data posizione (partendo da 0)
Non viene controllata la validità dell’indice
L’argomento è un size_type
Restituisce un Lvalue
operator+

Concatenazione tra stringhe
operator=

Copia carattere per carattere
operator== != < <= > >=

Operatori di confronto
Membri di string

Ricerca di sottostringhe



Ricerca di un carattere





find_first_of
find_last_of
find_first_not_of
find_last_not_of
Sostituzione


find
rfind
replace
Sottostringa

substr
Stringhe stile C

Il C++ eredita dal C la nozione di stringa
come array di char, in cui l’ultimo carattere
è null


char s[] = {‘C’, ‘i’, ‘a’, ‘o’,
‘\0’};
char *s = “Ciao”;



Il null è aggiunto in automatico
while(*s) {
// fai qualcosa con *s
s++;
}
Per un oggetto string è definito il metodo
c_str() che restituisce la stringa stile C
corrispondente
Input di stringhe
string s;
cin >> s;
Legge e scarta spazi bianchi iniziali
 Legge tutti i caratteri fino al successivo
spazio bianco

string s;
getline(cin, s)

Legge una riga intera, fino al newline
(che viene scartato)
Input/output

#include <iostream>
definisce oggetti usati per l’input/output
usando la console, basati su flussi (stream)

istream (input stream), flusso di input




ostream (output stream), flusso di output




L’input da un istream si effettua con l’operatore >>
cin, istream che funge da input standard
Funzione getline, legge una string da un istream
L’output su un ostream si effettua con l’operatore <<
cout, ostream che funge da standard output
cerr, ostream destinato all’output dei messaggi di
errore
iostream legge e scrive su un flusso

Deriva da istream e ostream
IO di caratteri

get(c) mette un char in c

putback(char) rimette nel flusso
put(char) scrive un char
 get() restituisce il prossimo byte
(come int)

unget torna indietro di un byte
 peek() “spia” il prossimo byte senza
leggerlo

IO di più caratteri





get(sink, size, delim) legge size caratteri o
finche fino a delim escluso, e li mette nel
vettore sink
getline(sink, size, delim) idem ma legge e
scarta delim
read(sink, size) legge size byte e li mette in
sink
gcount() restituisce il numero di byte letti
dall’ultima lettura
ignore(size, delim) ignora size caratteri o
fino a delim incluso
Classi stream

I flussi non permettono copia o
assegnamento

Non si possono usare direttamente come
parametri o tipi di ritorno, ma solo
tramite puntatori o riferimenti
Input/output object oriented

Il meccanismo di IO è indipendente

Dal dispositivo
 Console
 File
 Stringa

Dimensione del carattere
Input/output su file

#include <fstream>

ifstream
 Deriva

ofstream
 Deriva

da istream
da ostream
stream
 Deriva
da iostream
Input/output su string

#include <sstream>

istringstream
 Deriva

ostringstream
 Deriva

da istream
da ostream
stringstream
 Deriva
da iostream
Stato di uno stream

Per ogni oggetto di tipo di stream, es. istream

istream::iostate è un tipo intero che è usato per rappresentare
lo stato dello stream








bad() true se il bit badbit è settato
fail() true se il bit failbit è settato
eof() true se il bit badbit è settato
good() se lo stream è in uno stato valido
clear() resetta le condizioni allo stato valido




istream::badbit indica flusso corrotto (non recuperabile)
istream::failbit indica fallimento dell’operazione di IO (è possibile
riprovare)
istream::eofbit indica fine del flusso (carattere end-of-file)
clear(istream::iostate) resetta un flag
setstate(istream::iostate) setta un flag
rdstate() restituisce lo stato come iostate
Si può testare direttamente la validità del flusso, es.
while (cin >> a) { //… }
Stati indicati come bit si possono combinare tramite |
Buffer

Tutti gli IO su stream usano un buffer, svuotato

Al termine del programma



Quando è pieno
Forzandolo, immettendo endl(scrive un newline e
svuota il buffer), ends (inserisce un null e svuota il
buffer), flush (svuota il buffer e basta)


endl e \n sono diversi
Immettere unitbuf forza lo svuotamento del buffer ad
ogni operazione


…ma non se c’è un crash
nounitbuf
tie lega l’output di un flusso all’input di un altro flusso,
il buffer del primo si svuota quando il secondo legge



cin.tie(&cout) lo fa il sistema per noi
cin.tie() restiuisce un puntatore al flusso collegato
cin.tie(0) annulla il collegamento
IO su file

ifstream, ofstream, fstream
Costruttore che prende nome di un file
ifstream infile(“prova.txt”);
string s(“prova2.txt”);
ifstream infile2(s.c_str());
 f.open(“nomefile”);
 if (f) { //… }
 f.close();

 Serve
anche f.clear();
File Mode

Si può specificare la modalità di apertura di un file

Solo per ofstream e fstream:







out modalità di output, svuota il file all’apertura
app output, posizionamento alla fine del file prima di ogni
scrittura (preserva il contenuto del file)
trunc svuota il file (senza aprirlo)
in (modalità di input) solo per ifstream e fstream
ate modalità che di apertura che porta immediatamente
all’end-of-file
binary modalità per cui il contenuto è considerato come
sequenza di bytes (non si tenta di interpretarli)
Es. f.open(“file.dat”, ofstream::out |
ofstream::app)
Accesso casuale

seek
seekg, seekp
 seekg(position)
 seekg(offset, dir) dove dir è beg,
cur, end


tell


tellg, tellp
c’è un solo cursore!
Flussi su string


I flussi su string servono ad effettuare IO
in memoria
istringstream, ostringstream, srtingstream





string s(“pippo”);
stringstream ss(s);
ss.str() restituisce la stringa
ss.str(s) copia la stringa su s
Tramite flussi su string posso ottenere IO
formattato

Operatori << e >> ridefiniti
Stato della formattazione




Oltre allo stato (del flusso), i flussi
mantengono uno stato della formattazione
usata
La formattazione viene variata inserendo
nel flusso dei manipolatori
flags() restituisce lo stato corrente
flags(fmtflags) setta lo stato

Es. ostream::fmtflags è il tipo intero unsigned
che serve a contenere i flag
Alcuni manipolatori sono definiti in iomanip
Formattazione dei numeri interi

boolalpha stampa i valori booleani come
true e false (invece di 1 e 0)


noboolalpha
hex, oct, dec specificano la base numerica

showbase causa la visualizzazione della base





0xnnnn indica un esadecimale
0nnnn indica un ottale
nnnn indica un decimale
uppercase visualizza esadecimali con lettere
maiuscole
setbase(int), accetta 8, 10 o 16
Formattazione dei numeri in
virgola mobile

Precisione (numero di cifre)




Default 6
Arrotondamento (non troncamento) al numero di cifre
desiderato
precision() restituisce la precisione corrente
precision(int) imposta la precisione


Notazione (decimale o scientifica)




Di default dipende dalla dimensione
fixed, scientific
cout.unsetf(ostream::floatfield) ritorna al default
Posizione del punto decimale



Oppure manipolatore setprecision(int)
Di default omesso se non c’è parte frazionale
showpoint
Segno +


Di default il + per i numeri positivi è omesso
showpos
Posizionamento e riempitivi






setw(int) imposta la dimensione minima del
prossimo output
left allinea a sinistra (aggiunge riempitivi a
destra)
right allinea a destra (aggiunge riempitivi a
sinistra)
internal aggiunge riempiti tra segno e
valore
skipws salta gli spazi bianchi dall’input
setfill(char) permette di specificare il
carattere usato come riempitivo
Scarica

Lezione 9