Sei sulla pagina 1di 20

streamsinC++

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 ...

streamsize namespace std int


streamoff namespace std long
fmtflags ios_base tipo enumerato

iostate ios_base tipo enumerato

openmode ios_base tipo enumerato

seekdir ios_base tipo enumerato

pos_type ios long


off_type ios long
Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
modidiaperturadiunfile
la costruzione di un oggetto stream e l'apertura del file associato
all'oggetto sono due operazioni logicamente e cronologicamente
distinte
di solito si usa prima il costruttore di default dell'oggetto (che non fa
nulla) e poi un suo particolare metodo (la funzione open) che gli
associa un file e lo apre
questo permette di chiudere il file (tramite un altro metodo, la
funzione close) prima che l'oggetto sia distrutto e quindi riutilizzare
l'oggetto stesso associandogli un altro file
non possono coesistere due files aperti sullo stesso oggetto
un file ancora aperto al momento della distruzione dell'oggetto viene
chiuso automaticamente.

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::app il file deve essere aperto con posizione (permanentemente) 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(pos_type pos) sposta la posizione corrente in pos; ritorna *this

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

costruttore di default crea l'oggetto senza aprire nessun file; deve


ovviamente essere seguito da una open
costruttore con esattamente gli stessi riunisce insieme le operazioni del costruttore di default
argomenti della open e della open

bool isopen() ritorna true se esiste un file aperto associato


all'oggetto

Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidi(o)stringstream

ostringstream(ios_base::openm costruttore di default unario:


ode mode = ) mode:
ios_base::out (ostringstream)
ios_base::out | ios_base::in (stringstream)
ostringstream(const string& costruttore di default binario:
str, ios_base::openmode mode mode:
= ) ios_base::out (ostringstream)
ios_base::out | ios_base::in (stringstream)
string str() crea l'oggetto senza aprire nessun file; deve
ovviamente essere seguito da una open
costruttore con esattamente gli stessi riunisce insieme le operazioni del costruttore di default
argomenti della open e della open

bool isopen() ritorna true se esiste un file aperto associato


all'oggetto

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)

void close() chiude il file senza distruggere l'oggetto *this

costruttore di default crea l'oggetto senza aprire nessun file; deve


ovviamente essere seguito da una open
costruttore con esattamente gli stessi riunisce insieme le operazioni del costruttore di default
argomenti della open e della open

bool isopen() ritorna true se esiste un file aperto associato


all'oggetto

Fondamenti di programmazione in C++. Algoritmi, strutture dati e oggetti L. Joyanes Aguilar Copyright 2008 The McGraw-Hill Companies srl
metodispecificidiistringstream

istringstream(ios_base::openm costruttore di default unario


ode mode = ios_base::in )

istringstream(const string& costruttore di default binario


str, ios_base::openmode mode
= ios_base::in )

string str() crea l'oggetto senza aprire nessun file; deve


ovviamente essere seguito da una open

costruttore con esattamente gli stessi riunisce insieme le operazioni del costruttore di default
argomenti della open e della open

bool isopen() ritorna true se esiste un file aperto associato


all'oggetto

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

void ios::clear(iostate imposta lo stato con st (cancellando il valore precedente);


st=goodbit) chiamando clear() senza argomenti si imposta goodbit

void ios::setstate(iostate st) aggiunge il flag st allo stato corrente, eseguendo


l'istruzione: clear(rdstate() | st);

bool ios::good() const ritorna rdstate() == goodbit

bool ios::fail() const ritorna bool(rdstate() & failbit)


bool ios::bad() const ritorna bool(rdstate() & badbit)
bool ios::eof() const ritorna bool(rdstate() & eofbit)

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