appunti3s:oggetti_di_tipo_stream
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revision | |||
appunti3s:oggetti_di_tipo_stream [2019/07/28 11:27] – profpro | appunti3s:oggetti_di_tipo_stream [2020/06/08 22:19] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | >> per tornare all' | ||
+ | ====== Stream (flusso di dati) ====== | ||
+ | Si sono già utilizzati gli operatori " | ||
+ | >> Nel seguente testo i termini input e output sono sempre riferiti al programma, quindi: | ||
+ | |||
+ | * "in input" significa "in ingresso al programma" | ||
+ | * "in output" | ||
+ | |||
+ | |||
+ | ===== Operatore Extractor >> ===== | ||
+ | |||
+ | Solo adesso, giunti a questo livello di studio, si può comprendere che Extractor è un operatore che si applica su due // | ||
+ | < | ||
+ | {{ : | ||
+ | ===== Operatore Insertion << ===== | ||
+ | |||
+ | Anche questo è un operatore che si applica su due // | ||
+ | < | ||
+ | |||
+ | Questi operatori restituiscono a loro volta un oggetto stream | ||
+ | < | ||
+ | quindi possono essere usati ricorsivamente, | ||
+ | < | ||
+ | ====== fstream ====== | ||
+ | |||
+ | In modo analogo a std%%:: | ||
+ | |||
+ | < | ||
+ | std:: | ||
+ | is >> varstring; | ||
+ | // l' | ||
+ | < | ||
+ | std:: | ||
+ | os << " | ||
+ | |||
+ | Questi sono " | ||
+ | Gli oggetti di tipo // | ||
+ | |||
+ | ===== File ===== | ||
+ | Un file contiene una sequenza | ||
+ | * Se ogni Byte rappresenta nella realtà un carattere (char), il file può essere trattato come un //file di caratteri// (metodo predefinito). | ||
+ | * Se rappresenta altro (es: un float è un valore che occupa diversi Byte) il file deve essere trattato come un //file binario// | ||
+ | Se non diversamente specificato un file è aperto come file di testo, altrimenti in caso di immagini, file audio, file eseguibili, si devono aprire in formato binario. | ||
+ | |||
+ | Un file possiede un nome (di solito con estensione) una data e il formato in cui sono organizzati i dati al suo interno. (vedere problema dei caratteri nei nomi dei file e problema dei {{appunti4s: | ||
+ | Un file può essere aperto in diversi " | ||
+ | <file c stream.cpp> | ||
+ | /* questo programma è stato scritto da Fabio | ||
+ | | ||
+ | * esempio di lettura e scrittura su file di testo | ||
+ | */ | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | |||
+ | // definisce un oggetto stream aperto in lettura e scrittura (deve esistere). | ||
+ | // se era aperto solo in scrittura poteva anche non esistere | ||
+ | | ||
+ | |||
+ | // ma apertura in lettura puo' dare errore se file inesistente. | ||
+ | if (!flussoFile) std::cout << " | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Usando i file di testo, oltre a leggere una parola su una variabile (string) si può leggere anche un gruppo di cifre, che rappresentano un numero, su una variabile float (o di altro tipo numerico) | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Stato del flusso file ===== | ||
+ | |||
+ | Gli oggetti stream possiedono degli //stati// che possono essere verificati con delle funzioni: | ||
+ | < | ||
+ | flussoFile.good(); | ||
+ | flussoFile.eof(); | ||
+ | flussoFile.fail(); | ||
+ | flussoFile.bad(); | ||
+ | </ | ||
+ | < | ||
+ | flussoFile.clear(); | ||
+ | flussoFile.unget(); | ||
+ | flussoFile.exceptions(ios_base:: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ====funzione open==== | ||
+ | |||
+ | < | ||
+ | |||
+ | <file cpp 61.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | std::string parola = " | ||
+ | const std::string nomeFile = " | ||
+ | // bisogna passare una costante stringa... | ||
+ | std:: | ||
+ | |||
+ | mioFile.open(" | ||
+ | std::cout << "Salvo una parola" | ||
+ | mioFile << parola << std::endl; | ||
+ | |||
+ | mioFile.close(); | ||
+ | // e posso riutilizzare l' | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | Il buffer serve per non scrivere un carattere alla volta nel file, ma per riempire un vettore e scrivere solo quando il vettore è pieno, oppure quando lo decide il programmatore con flush() | ||
+ | |||
+ | |||
+ | ===== Posizionamento ===== | ||
+ | Un file può essere letto sequenzialmente, | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | < | ||
+ | | ||
+ | | ||
+ | | ||
+ | </ | ||
+ | |||
+ | ===== Approfondimento ===== | ||
+ | |||
+ | Provare a scrivere un programma che legge separatamente nome e cognome e poi mette questi dati all' | ||
+ | |||
+ | Provare a scrivere l' | ||
+ | |||
+ | Provare a scrivere un programma che legge dati da un file in un buffer (aiutati da std%%:: | ||
+ | |||
+ | <file cpp 63.cpp> | ||
+ | #include < | ||
+ | #include < | ||
+ | /* programma che usa un buffer per scrivere in un file */ | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | | ||
+ | // non si inviano direttamente dati al file (mem. massa) | ||
+ | // ma si accumulano temporaneamente in uno stream (mem. centrale) | ||
+ | | ||
+ | |||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | // per poterla inviare ad un fstream | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | >> per tornare all' |