Fondamenti di Informatica II 24. Gestione I/O e File in C++

Documenti analoghi
Laboratorio di Informatica

Gestione di files Motivazioni

Input / Output attraverso stream. I/O in C vs. I/O in C++

4. Accesso diretto per gli archivi con record a lunghezza costante

IL CONCETTO DI FILE. È illecito operare oltre la fine del file.

Gestione dei file di dati

Uno stream rappresenta un flusso di dati da cui e' possibile

Input/Output. Input/Output. Lezione 16

ISTITUTO TECNICO INDUSTRIALE STATALE LA GESTIONE DEI FILE DI TESTO IN C++

Laboratorio di Programmazione Gruppo III, Ml-ZZ. Alberto Finzi

Fondamenti di Informatica

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Corso di Programmazione ad oggetti

BOZZA. cin per la comunicazione dal dispositivo di input standard, la tastiera, al programma (stream di input standard)

Input/output in C++: la libreria iostream Stringhe in C++: il tipo std::string

Qualsiasi programma in C++ segue lo schema:

2) FILE BINARI: è una sequenza di byte avente una corrispondenza uno a uno con la sequenza ricevuta dal dispositivo esterno.

Sommario. Introduzione... xv. Giorno 1 Elementi base del linguaggio C

1. Soluzione esercizio XYZ SpA

Input/output in C e in C++

Laboratorio di Informatica

A. Veneziani Files di record

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Fondamenti di Informatica

La programmazione Orientata agli Oggetti: OOP

I files in C. A cura del prof. Ghezzi

GESTIONE DEI FILE IN C. Docente: Giorgio Giacinto AA 2008/2009

Laboratorio di Informatica

Introduzione C++ Il compilatore. La compilazione in g++ Introduzione a C, C++ e Java. C++ C Java 1977 C 1986 C++ Compilatori Librerie Usare oggetti

ingresso/uscita da file

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Scrittura formattata - printf

File binari e file di testo

Elementi di Programmazione in C++

Indice. La gestione dei file in C e gli stream. Apertura e chiusura di un file. Operazioni sui file. Accesso sequenziale e non sequenziale

Esercizi. I File ed il C

Text files, streams. I file che ci interessano sono file di testo. anche se, logicamente, contengono numeri o altro

Funzioni di libreria. Richiedono tutte. #include <math.h> fabs(x) sqrt(x) pow(x,a) exp(x) log(x)

Files in C++ Fondamenti di Informatica. R. Basili. a.a

Un esecutore di un linguaggio simbolico e costituito dalla coppia Compilatore, processore (o Interprete, processore)

Università degli Studi di Cassino Corso di Fondamenti di Informatica Tipi strutturati: Stringhe. Anno Accademico 2010/2011 Francesco Tortorella

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

ingresso/uscita da file

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Gestione dei file. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Un file è un astrazione di memorizzazione di dimensione potenzialmente illimitata (ma non infinita), ad accesso sequenziale.

I file Laboratorio di Linguaggi di Programmazione a.a. 2001/2002

File e puntatori a file

Corso sul linguaggio Java

I file possono essere manipolati (aperti, letti, scritti ) all interno di programmi C. dischi nastri cd

Capitolo 5 -- Stevens

Lezione 14. Stream, fstream e file

Introduzione. L elaborazione dei files in C. Elaborazione dei files (1) Elaborazione dei files (2) D.D. cap. 11+ pp K.P. pp.

Lezione 6 Introduzione al C++ Mauro Piccolo

Input/Output. Lettura e scrittura Caratteri e Stringhe: Terminale e file. Input/output. caratteri stringhe formattato ascii binari

Linguaggio C: i file

Dal C al C++ Corso di Linguaggi di Programmazione ad Oggetti 1. a cura di Giancarlo Cherchi

Le stringhe. Le stringhe

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Programmazione modulare

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

LIBRERIE STANDARD in C. LIBRERIE STANDARD in C

ESERCIZI DI PROGRAMMAZIONE C/C++ per le classi seconde

Operazioni di lettura/scrittura

Gestione dei File C. Generalità

Gestione dei File. dischi nastri cd

Lettura e scrittura di file di dati input/output

Corso di Fondamenti di Informatica. Puntatori e Allocazione Dinamica

Laboratorio di Informatica Ingegneria Clinica Lezione 30/11/2011

Riferimenti ad oggetti: Fondamenti di Informatica L-B Esercitazione n 4 Java: I/O, Costruttori e altro. Riferimenti ad oggetti: (Esempio)

Il linguaggio C. Notate che...

Gestione dei File in C

Le librerie standard. ! La libreria standard del C è in realtà un insieme di librerie

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Introduzione al C++ (continua)

Implementazione dell albero binario in linguaggio C++

Fondamenti di Informatica

Indice. Materiale di riferimento. Struttura di un programma in C++ Introduzione al C++ (CAP 1) Alberto Garfagnini e Marco Mazzocco A.A.

Informatica! Appunti dal laboratorio 1!

# $ %$&'" '! () *$+,!-

Corso di Programmazione ad Oggetti

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

INTRODUZIONE ALLA PROGRAMMAZIONE

Indice. Introduzione PARTE PRIMA LE BASI DEL C++: IL LINGUAGGIO C 1

N algoritmo Traccia in breve 1 (Click)

I/O FILE. Sommario I/O FILE. I/O FILE LETTURA DA FILE DI TESTO oggetto di tipo ifstream. I/O FILE: lettura e scrittura su file di testo

Istruzioni semplici e strutturate

Laboratorio di programmazione

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Fondamenti di Programmazione Ingegneria dell Automazione Industriale Ingegneria Elettronica e delle Comunicazioni

Introduzione alla programmazione in C++

1: /* Nome del programma: gestione_articoli_01.cpp 2: Realizzato da: Gaetano Della Cerra 3: Data: 06/02/ III Informatica Serale I.T.I.S.

Input/Output. Console e File.

Costanti e Variabili

La programmazione ad oggetti (OOP)

16.2 Tipi classe (I)

Laboratorio di Programmazione Laurea in Informatica A.A. 2000/2001 Docente: A. Lanza

Transcript:

Gli stream in C++ stream è un astrazione che rappresenta un flusso di dati che scorre tra una sorgente e una destinazione idea di Stroustrup : una sequenza di caratteri Fondamenti di Informatica II 24. Gestione I/O e File in C++ esempi: interattivi (iostream) cin stream di input associato con la tastiera cout stream di output associato con il display file ifstream definisce un nuovo stream di input (associato normalente ad un file) ofstream definisce un nuovo stream di output (normalmente associato ad un file) Corso di Laurea in Ingegneria Informatica A.A. 2008-2009 2 Semestre Corso (A-M) Prof. Giovanni Pascoschi 2 Gli stream in C++ Gerarchia delle classi in C++ (ios) ios la prima classe storicamente implementata da Schwarz è istream che identifica un flusso di caratteri da un dispositivo di input arbitrario a un applicativo software arbitrario istream ostream 1. la classe base è ios per il processamento ad alto livello 2. la classe base è streambuf per il processamento a basso livello (dispositivi fisici) ifstream istringstream iostream istrtream fstream ofstream ostringstream ostrstream strstream 3 4

La gerarchia delle classi in C++ (streambuf) Header files per la libreria degli stream I/O streambuf filebuf stringmbuf iostream contiene le informazioni di base richieste per tutte le operazioni di stream bidirezionali di I/O strtreambuf stdiobuf iomanip contiene le informazioni usate per ottenere I/O formattati con manipolatori di flusso stream parametrizzati streambuf per gestire un interfaccia ai dispositivi fisici (processamento a basso livello) stdiobuf si utilizza per combinare I/O di flussi C++ con le funzioni C-style fstream contiene le informazioni per gestire le operazioni di I/O su file strstream contiene informazioni per gestire le operazioni di I/O in memoria (p.e. per le stringhe in memoria) 5 6 Flussi standard Flussi I/O su file il flusso cin definito nella classe istream è associato all input standard (di solito se non è reindirizzato coincide con la tastiera (stdin)) il flusso cout definito nella classe ostream è associato all output standard (di solito se non è reindirizzato coincide con lo schermo (stdout)) il flusso cerr definito nella classe ostream è associato al flusso standard di errore (di solito diretto verso lo schermo) e non usa un buffer di memoria il flusso ifstream derivata dalla classe istream è utilizzata per gestire la lettura da file (solo lettura) il flusso ofstream derivata dalla classe ostream è utilizzata per gestire la scrittura su file (solo scrittura) il flusso fstream derivata da iostream è utilizzata per gestire sia la lettura che la scrittura da file (lettura+scrittura contemporaneamente) il flusso clog è simile a cerr ma usa un buffer di memoria 7 8

La classe istream La classe istream (cin) la classe istream deriva dalla classe ios la classe istream consente di gestire un flusso di input (metodi per acquisire dati in modalità formattata e non formattata) al fine di consentire operazioni di I/O ad alto livello, l operatore >> è usato in overloading con tutti i tipi predefiniti del C++ l operatore >> si utilizza applicandolo a un oggetto della classe istream (cin): cin >> a; // >> cerca di estrarre dall oggetto cin un flusso di caratteri l utilizzo di cin consente di monitorare lo stato di un eventuale errore in fase di acquisizione (p.e. acquisizione di un carattere quando invece si attende un intero) la classe istream ha un attributo che indica lo stato (flag = good/bad/fail) cin.good( ) controlla se la cin è stata effettuata correttamente ritorna valore non-zero ( true ) se lo stream non ha incontrato dei problemi (come lettura dell EOF o file non esistente) cin.bad( ) controlla se la cin è stata effettuata con qualche errore ritorna valore non-zero ( true ) se lo stream è totalmente inutilizzabile, come ad esempio se il file non si puo aprire cin.fail( ) controlla se la cin non si è potuta completare ritorna valore non-zero ( true ) se l ultimo comando cin è fallito cin.clear( ) serve per ripristinare un flag (eofbit) che permette di individuare se l input è terminato oppure no (ctrl D o ctrl Z per segnalare la EOF) 9 10 La classe istream (get & getline) La classe istream (getline) siccome la cin interrompe l acquisizione di una variabile allorquando si incontra uno spazio, è necessario usare la cin.get( ) e la cin.getline( ) per acquisire stringhe con spazi vuoti la get( ) serve per acquisire un solo carattere o piu caratteri contemporaneamente: istream& get( ); //prototipo del metodo get senza parametri istream& get(char& c); // prototipo del metodo get con passaggio di un parametro istream& get(char* buffer, int n, char sep= \n ); // prototipo del metodo get simile a getline (3 campo opzionale) istream& è il riferimento all oggetto flusso di cui è membro la getline( ) inserisce automaticamente il carattere di terminazione \0 come ultimo carattere della stringa sintassi cin.getline (buffer, 20, char sep= \n ); // simile alla sintassi della get la differenza tra get e getline è che quest ultima estrae il carattere separatore dal flusso di input prima di aggiungere il carattere \0 nella stringa la getline puo creare dei problemi nell acquisizione: int main( ){ string regione; string citta; cin.getline(regione); cin.getline(citta);... se si inserisce prima puglia e poi bari le variabili acquisite sono: regione = puglia citta = \n \0 (il \n rimane nel buffer a fronte della prima getline. La successiva getline() acquisisce proprio il \n poichè per default è il carattere di separazione si ferma ed aggiunge \0) per ovviare al problema ci sono 2 possibilità: cin.getline(temp, 2); // x pulire il buffer della tastiera in una variabile di appoggio cin.ignore(80, \n ); // rimuove dal buffer di input tutti i caratteri fino a \n 11 12

La classe ostream Overloading degli operatori << e >> (esempio 2) 13 deriva dalla classe ios la classe ostream consente di gestire un flusso di output (metodi per mettere in uscita dati in modalità formattata e non formattata) per consentire operazioni di I/O ad alto livello l operatore << è usato in overloading con tutti i tipi predefiniti del C++ l operatore << si utilizza applicandolo a un oggetto della classe ostream (cout): cout << a; // << cerca di porre in uscita verso l oggetto cout un flusso di caratteri 14 class Complesso { double a; double b; public: Complesso(double a = 0, double b = 0); void setreale(double); void setimmag(double ); double getreale( ) const; double getimmag( ) const; Complesso operator+(const Complesso &n) const; Complesso operator-(const Complesso &n) const; Complesso operator*(const Complesso &n) const; Complesso &operator=(const Complesso &n); bool operator==(const Complesso &n) const; bool operator!=(const Complesso &n) const; friend ostream& operator<<(ostream &output, const Complesso &n); friend istream& operator>>(istream &input, Complesso &n); ; Overloading degli operatori << e >> (esempio 2) Overloading degli operatori << e >> (esempio 2) // operatore di assegnamento Complesso& Complesso::operator=(const Complesso &n) { a = n.a; b = n.b; return *this; // operatore di uguaglianza bool Complesso::operator==(const Complesso &n) const { return a == n.a && b == n.b; // operatore di disuguaglianza bool Complesso::operator!=(const Complesso &n) const { return a!= n.a b!= n.b; etc etc etc // operatore di inserimento ostream &operator<<(ostream &output, const Complesso &n) { output << n.a; if (n.b >= 0) { output << "+j" << n.b; else { output << "- j" << -1*n.b; return output; // operatore di estrazione istream &operator>>(istream &input, Complesso &n) { input >> n.a >> n.b; return input; 15 16

Overloading degli operatori << e >> (esempio 2) I manipolatori dell output int main( ) { Complesso x; Complesso z; double re, imm; cout << "Valore iniziale di x = " << x << endl; // 0+j0 cout << "Immetti i nuovi coefficienti di x: "; cin >> x; // cin >> re >> imm; // x.setreale(re); // x.setimmag(imm); cout << Nuovo valore di x= << x << endl; // cout << "Nuovo valore di x = " << x.getreale( ) << " + j" << x.getimmag( ) << endl;... system ("pause"); i manipolatori consentono di operare sugli oggetti di tipo stream #include <iomanip> endl è un manipolatore che invia \n allo stream di output e svuota il buffer di I/O cout.flush( ) consente lo svuotamento del buffer associato allo stream dec /oct / hex / setw / setfill / setprecision (ved. 1 modulo) 17 18 Gli indicatori di formato Gli indicatori di formato esistono dei manipolatori specializzati chiamati indicatori di formato che utilizzano dei flag i flag si possono settare tramite il metodo setiosflags e resettare tramite resetiosflags è possibile combinare diversi flags tramite un OR sui bit ( ) ios::left ios::right ios::dec ios::oct ios::hex ios::scientific ios::fixed allinea a sinistra allinea a destra rappresenta in base 10 rapresenta in base 8 rappresenta in base 16 rappresenta nel formato esponenziale rappresenta i numeri float con un numero fisso di decimali esempio: cout << 10. << setiosflags(ios::scientific) << 10. << endl; 19 20

I/O da file in C++ Modi di apertura del file il file è inteso come flusso esterno di dati tre classi per gestire i file (ifstream, ofstream, fstream) contenute nell header file <fstream> apertura implicita del file ifstream fin ( dati ); ofstream fout ( dati, ios::out); fstream finout; // si puo aprire sia in lettura che in scrittura Nome ios::in ios::out ios::app ios::ate ios::trunc ios::nocreate ios::noreplace ios::binary Descrizione Apre il file in lettura Apre il file in scrittura Apre il file in scrittura in append Apre il file cerca la fine del file cancella tutto il contenuto precedente nel file se il file non esiste, l apertura del file è impossibile se il file esiste, l apertura del file ritorna un errore apre il file in modalità binaria 21 22 Classe fstream Errori sui file apertura esplicita del file fstream f f.open ( Archivio.dat, ios::in ios:: out ios:: binary) il metodo open di solito non si usa perchè le tre classi di gestione dei file hanno costruttori che aprono automaticamente il file quindi la sintassi che si puo usare è quella che consente l apertura implicita: fstream f ( Archivio.dat, ios::in ios:: out ios:: binary); // apre il file 1 modalità : if (!nomestream) cout << errore nell apertura del file << endl; 2 modalità : if(nomestream.fail( )) cout<< errore nell apertura del file <<endl; 3 modalità : tramite la gestione delle eccezioni try...catch f.close( ); // metodo per chiudere il file 23 24

Classi per i file Esempio di scrittura su file I/O di testo le classi per i file ereditano i metodi già visti per iostream: int good( ); int fail( ); int eof( ); la lettura e scrittura su file di testo viene effettuato tramite gli operatori << e >> e le operazioni già previste per cin e cout (get, getline, ecc.) #include < fstream > using namespace std; int main( ) { ofstream fout; fout.open( registro.dat ); fout << Hello World ; fout.close( ); return 0; 25 26 Esempio di lettura da file I/O di testo Gestione dei file binari #include <iostream > #include < fstream > #include < string > using namespace std; int main( ) { ifstream fin; fin.open( archivio.txt ); string line; while(!fin.eof( )) { getline(fin,line); cout<<line; fin.close( ); return 0; get( ) legge un byte e punta al prossimo byte put( ) scrive un byte e punta alla prossima locazione read( ) legge un blocco e punta al prossimo blocco write( ) scrive un dato e punta al prossimo blocco 27 28

Gestione dei file binari Gestione dei file binari Sintassi: nomestream.write((char*) &dipendente, sizeof(dipendente)); nomestream.read((char*) & dipendente, sizeof(dipendente)); N.B.: viene fatto un casting sul record di dipendente, perchè la funzione deve ricevere un puntatore a carattere Esistono due puntatori (in lettura e scrittura) seekg( ) vai ad una specifica posizione in lettura (current get position) seekp( ) vai ad una specifica posizione in scrittura (current put position) sintassi della seek: nomestream.seekg(posizione, inizio) dove posizione è long e inizio puo assumere i seguenti valori: ios::beg ios::cur ios::end 29 30 Gestione dei file binari Esempio Accesso Sequenziale (1) tellg( ) ritorna un intero che indica la posizione corrente del puntatore (in modalità lettura) tellp( ) ritorna un intero che indica la posizione corrente del puntatore (in modalità scrittura) n.b.: ogni volta che si fa un operazione di I/O il puntatore si sposta automaticamente #include <iostream> #include <string> #include <fstream> using namespace std; struct persona { int matricola; string cognome; string nome; int livello; ; typedef struct persona dip; dip dipendente; fstream fs; void registra(void); void visualizza(void); 31 32

Esempio Accesso Sequenziale (2) Esempio Accesso Sequenziale (3) 33 int main( ) { // registrazione fs.open( registro.dat,ios::in ios::binary); registra( ); fs.close(); // visualizzazione fs.fopen( registro.dat, ios::out ios::binary); if( fs.fail( )!= FALSE) { visualizza( ); fs.close( ); else cout<< Errore: l archivio non esiste <<endl; return 0; 34 void registra() { int risposta; do { cout<< Inserimento di un dipendente <<endl; cout<< Matricola: <<endl; cin>>dipendente.matricola; cout<< Cognome: <<endl; cin>>dipendente.cognome; cout<< Nome: <<endl; cin>>dipendente.nome; cout<< Livello: <<endl; cin>>dipendente.livello; fs.write((char *)&dipendente, sizeof(dip)); cout<< Elenco finito? (0 = no, 1 = si): <<endl); cin>>risposta; while(!risposta); return; Esempio Accesso Sequenziale (4) Esempio Accesso Diretto (1) void visualizza() { cout<< Elenco dipendenti <<endl; fs.read((char *)&dipendente, sizeof(dip)); while(fs.feof(fp)==false) { cout<< Matricola: <<endl; cout<<dipendente.matricola; cout<< Cognome: <<endl; cout<<dipendente.cognome; cout<< Nome: <<endl; cout<<dipendente.nome; cout<< Livello: <<endl; cout<<dipendente.livello; fs.read((char *)&dipendente, sizeof(dip)); return; #include <iostream> #include <fstream> #include <string> using namespace std; struct persona { int matricola; string cognome; string nome; int livello; ; typedef struct persona dip; dip dipendente; fstream fs; void registra(void); 35 36

Esempio Accesso Diretto (2) Esempio Accesso Diretto (3) int main( ) { // registrazione fs.open( registro.dat, ios::in ios::binary); if( fs.fail( )!= FALSE) { registra( ); fs.close( ); else cout<< Errore: l archivio non esiste <<endl; return 0; void registra() { int i; long posizione; cout<< Inserimento di un dipendente <<endl; cout<< inserire indice record dove inserire il dipendente <<endl; cin>>i; while(i > 0) { posizione = (i 1) * sizeof(dip); fs.seekg(posizione, ios::beg); if( fs.read((char *)&dipendente, sizeof(dip)) && dipendente.cognome[0]!= \0 ) { cout<< Attenzione codice gia presente <<endl; cout<< Matricola: <<endl; cin>>dipendente.matricola; cout<< Cognome: <<endl; cin>>dipendente.cognome; cout<< Impossibile registrazione <<endl; 37 38 Esempio Accesso Diretto (4) Output su stampante 39 else { cout<< Matricola: <<endl; cin>>dipendente.matricola; cout<< Cognome: <<endl; cin>>dipendente.cognome; cout<< Nome: <<endl; cin>>dipendente.nome; cout<< Livello: <<endl; cin>>dipendente.livello; fs.seeks(posizione, ios::beg); fs.write((char *)&dipendente, sizeof(dip)); cout<< inserire indice record dove inserire il dipendente (0 termina) <<endl; cin>> i ; fs.close( ); return; 40 #include <fstream> ofstream dispositivo (nome_disp); #include <fstream> using namespace std; int main( ) [ char titolo[50]; char autore[20]; cout << Inserire titolo ; cin >> titolo; cout<< Inserire autore ; cin >> autore; ofstream stampante ( LPT1 ); stampante << il titolo e << titolo; stampante << l autore e << autore; return 0 ]

Riepilogo della lezione Fine della lezione Gestione dell I/O e dei file in C++ Gestione dell I/O in C++ Gerarchia delle classi di I/O Classi istream/ostream Gestione dei file in C++ (accesso sequenziale e diretto) Output su stampante Domande? 41 42