Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
oggetto stream
"file intelligente" (con propriet e metodi, come tutti gli oggetti), che
agisce come "sorgente" da cui estrarre (input), o "destinazione" in
cui inserire (output) i dati
2 forme di flusso
flussi di testo: interpretano i bytes come caratteri
char ASCII ISO8859/1-15
wchar_t UNICODE UTF/8,16, 32
flussi binari: non interpretano i bytes
posizione corrente
indice (paragonando lo stream a un array) del prossimo byte che
deve essere letto o scritto
ogni operazione di I/O modifica la posizione corrente
l'inserimento interno all'oggetto stream sovrascrive i bytes
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
gerarchiadelleclassidiI/O
basso livello
alto livello
oggetti di iostream
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
headerfiles
<iostream>
<fstream>
<sstream>
alto livello <strstream>
<iostream> operazioni di I/O con i flussi di input ed output
standard, nonch gli oggetti cout, cin, cerr e clog
<fstream> dichiara le classi per operazioni di I/O su files
<sstream> dichiara le classi per gestire le C-string
<strstream> dichiara le classi per gestire le standard string
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
ios_base e ios
ios_base attributi e metodi comuni I/O
ios , specializzazione con argomento char di
template <class T> class basic_ios
strumenti di uso generale per le operazioni di I/O
funzioni di controllo degli errori, flags per l'impostazione dei
formati di lettura e/o scrittura, modi di apertura dei files
entrambe le classi dichiarano i loro costruttori nella sezione
protetta, e quindi non possibile istanziarle direttamente; si
devono invece utilizzare le classi derivate da ios, a partire da
istream (per l'input) e ostream (per l'output), che
contengono, per eredit, anche i membri definiti in ios e
ios_base
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
istream,ostreameiostream
istream
overload dell'estrattore >>
istream cin;
serve quasi esclusivamente per fornire propriet e metodi
alle classi derivate
ostream
overload dell'inseritore <<
ostream cout, cerr, clog;
serve pi che altro a fornire propriet e metodi alle sue
classi derivate
iostream : istream, ostream
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
ifstream,ofstreamefstream
derivano dalle precedenti a cui aggiungono open e close
ifstream/ofstream
oggetti associati a files di sola lettura/scrittura (testo o binario) ad
accesso generalmente sequenziale
fstream
oggetti associati a files di lettura o scrittura; particolarmente
indicata per operare su files binari ad accesso casuale
l'oggetto associato al file left-operand (come cin/cout)
in lettura, se il risultato dell'operazione NULL (ovvero false), vuol
dire di solito che si raggiunta la fine del file (eof)
ereditano metodi per la lettura e/o scrittura dei dati, posizionamento
nel file, gestione degli errori, definizione dei formati ecc
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
istringstream,ostringstream
stringstream
derivano dalle precedenti e servono per eseguire pseudo
operazioni di I/O su stringa
istringstream
oggetti-stringa dai quali si possono estrarre dati come se fossero
files
se il risultato di un'operazione di estrazione NULL, significa che
si raggiunta la fine della stringa (eos)
ostringstream
oggetti-stringa nei quali si possono inserire dati come se fossero
files, eventualmente modificando la dimensione della stringa
permette di espandere una stringa liberamente, in base alle
necessit (per esempio, per preparare un output "formattato")
stringstream
serve sia per le operazioni di input che di output
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
tipidefinitinellalibreria
ambito visibilit o classe normalmente implementato
come ...
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
tipoenumeratoopenmode
ios_base::in il file deve essere aperto in lettura
ios_base::out il file deve essere aperto in scrittura
ios_base::ate il file deve essere aperto con posizione (inizialmente) sull'eof
ios_base::trunc il file deve essere aperto con cancellazione del suo contenuto
preesistente; se il file non esiste, viene creato (nei casi precedenti deve
gi esistere)
ios_base::binary il file deve essere aperto in modo "binario", cio i dati devono essere
scritti o letti esattamente come sono; di default il file aperto in modo
"testo", nel qual caso, in output, ogni carattere \n pu (dipende
dall'implementazione!) essere trasformato nella coppia di caratteri \r/\n
(e viceversa in input)
... | ... combina due modi, tuttavia, che il significato di alcune combinazioni
dipende dall'implementazione e quindi va verificato "sperimentalmente",
consultando il manuale del proprio sistema; nelle ultime versioni dello
standard, il flag ios_base::out non pu stare da solo, ma deve
essere combinato con altri
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
alcunimetodidiostream
ostream& put(char c) inserisce il carattere c nella posizione corrente di
*this; ritorna *this
ostream& write(char* p, inserisce nella posizione corrente di *this una
streamsize n) sequenza di n bytes, a partire dal byte puntato da p;
ritorna *this
pos_type tellp() ritorna la posizione corrente
ostream& seekp(off_type off, sposta la posizione corrente di off bytes a partire dal
ios_base::seekdir seek) valore indicato dall'enumeratore seek; ritorna *this;
off pu anche essere negativo; se l'operazione tende
a spostare la posizione corrente fuori dal range, la
seekp non viene eseguita e la posizione corrente
resta invariata; eof e eos) sono ancora nel range
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidi(o)fstream
void open(const char* filename il nome del file da aprire (una stringa del
filename, ios_base::openmode C, non un oggetto string!), mode rappresenta il
mode = ....) modo di apertura del file ed di default:
ios_base::out | ios_base::trunc (ofstream)
ios_base::out | ios_base::in (fstream)
void close() chiude il file senza distruggere l'oggetto *this
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidi(o)stringstream
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
alcunimetodidiistream
int get() estrae un byte e lo ritorna al chiamante; un valore di ritorno
negativo indica che si verificato un errore, oppure che la
posizione corrente era gi sulla fine dello stream (eof o eos)
istream& get(char& c) estrae un byte e lo memorizza in c; ritorna *this
istream& get(char* p, estrae n-1 bytes e li memorizza nell'area puntata da p
streamsize n, char aggiungendo \0; ritorna *this; il processo di estrazione pu
delim='\n') essere interrotto in anticipo se:
1. raggiunta la fine dello stream
2. incontrato il carattere delim, il quale non viene estratto e
la posizione corrente si attesta sullo stesso
istream& getline(char* p, identica alla get precedente ma:
streamsize n, char 1. se incontra il carattere delim non lo estrae, ma la
delim='\n') posizione corrente si attesta dopo delim
2. se completa l'estrazione di n-1 bytes senza incontrare
delim, viene impostata una condizione di errore; in pratica
ci vuol dire che l'argomento n serve per imporre la
condizione:
posizione di delim - posizione corrente < n
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
alcunimetodidiistream
istream& read(char* p, differisce dalle funzioni precedenti per il fatto che non ha
streamsize n) delimitatori (a parte la fine dello stream) e estrae n bytes
(senza aggiungere il carattere '\0' in fondo); e quindi non legge
stringhe di caratteri, ma dati binari di qualsiasi tipo
streamsize readsome(char* come la read, salvo il fatto che ritorna il numero di bytes
p, streamsize n) effettivamente letti
istream& "salta" i prossimi n bytes, oppure i prossimi bytes fino a delim
ignore(streamsize n=1, (compreso); il default di delim (EOF) una costante predefinita
int delim=EOF) che indica la fine dello stream (normalmente implementata con
il valore -1); ignore serve soprattutto per "saltare" caratteri
invalidi nella lettura formattata da una stringa di input
pos_type tellg() ritorna la posizione corrente
istream& seekg(pos_type sposta la posizione corrente in pos; ritorna *this
pos)
istream& seekg(off_type sposta la posizione corrente di off bytes a partire dal valore
off, ios_base::seekdir indicato dall'enumeratore seek; ritorna *this; off pu anche
seek) essere negativo; se l'operazione tende a spostare la posizione
corrente fuori dal range, la seekg non viene eseguita e la
posizione corrente resta invariata; eof e eos) sono ancora nel
range
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidiifstream
void open(const char* filename il nome del file da aprire (una stringa del
filename, ios_base::openmode C, non un oggetto string!)
mode = ios_base::in)
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidiistringstream
costruttore con esattamente gli stessi riunisce insieme le operazioni del costruttore di default
argomenti della open e della open
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
statodell'oggettostreame
gestionedeglierrori
lo stato dell'oggetto stream rappresentato da 4 flags (enumeratori del
tipo iostate, definito nella classe ios_base), ciascuno dei quali pu
essere combinato con gli altri con un'operazione di OR bit a bit e separato
dagli altri con un'operazione di AND bit a bit:
ios_base::goodbit finora tutto bene e la posizione corrente non sulla fine dello
stream; nessun bit "settato" (valore 0)
ios_base::failbit si verificato un errore di I/O, oppure si tentato di eseguire
un'operazione non consentita (per esempio la open di un file che
non esiste
ios_base::badbit si verificato un errore di I/O irrecuperabile
ios_base::eofbit la posizione corrente sulla fine dello stream; un successivo
tentativo di lettura imposta anche failbit
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
statodell'oggettostreame
gestionedeglierrori
la classe ios, derivata di ios_base, fornisce alcuni metodi per la
gestione e il controllo dello stato:
ios_base::iostate ritorna lo stato che risulta dall'ultima operazione
ios::rdstate() const
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
manipolatoridiflusso<iomanip>
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl