Anno accademico 2010-2011 1 Input e Output in C. Anno accademico 2010-2011 2 Sommario Input e outputInput e output I flussi di I/O I flussi di I/O Luso.

Slides:



Advertisements
Presentazioni simili
File Linguaggio C.
Advertisements

Introduzione al linguaggio C++
INFORMATICA Altre Istruzioni di I/O
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Gestione dei file Ing. Simona Colucci.
LINGUAGGIO DI PROGRAMMAZIONE C
Java Stream e File.
Java Stream e File. La classe File Per operare con lintero file java mette a disposizione la classe File Per utilizzare la classe File è necessario importare.
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
PUNTATORI Introduzione
File System Cos’è un File System File e Directory
1 Informatica Generale Susanna Pelagatti Ricevimento: Mercoledì ore presso Dipartimento di Informatica, Via Buonarroti,
PHP e i files Laboratorio di Progettazione Web AA 2009/2010 Chiara Renso ISTI- CNR -
Operazioni di I/O da console e da file in C standard
Introduzione al linguaggio C
1 System Call per Comunicazione tra Processi Pipe.
SC che operano su file (1)
Anno accademico Il preprocessore del linguaggio C.
Anno accademico Le classi di memorizzazione.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
Anno accademico Array e puntatori in C.
INFORMATICA I file.
Programmazione Procedurale in Linguaggio C++
Caratteri e stringhe di caratteri
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
FILE DATI 16 lunedi 26 luglio giovedi ore 9 Come sappiamo, un file dati è un gruppo di informazioni tra loro correlate, memorizzate in un dispositivo di.
Funzioni definite dall’utente
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 15 Maggio 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Process synchronization
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 9 Maggio 2012.
File.
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Laboratorio di Linguaggi lezione XI: I/O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Introduzione agli stream e alle classi
INFORMATICA I file. © Piero Demichelis 2 File Per rendere più uniforme possibile il comportamento dei programmi in relazione alla grande varietà dei dispositivi.
INFORMATICA Altre Istruzioni di I/O. © Piero Demichelis 2 Funzioni di I/O Per la lettura e la scrittura da videoterminale il C prevede numerose istruzioni.
nome: sequenza di caratteri usata per denotare un oggetto
Esercizio: Copiare un file in un nuovo file mediante le funzioni read e write.
Strutture di controllo in C -- Flow Chart --
Esercizi di riepilogo sul linguaggio C: file, puntatori, liste
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
1 Gestione dei File Corso di Informatica A Vito Perrone.
File di testo, file binari
I File.
Le funzioni.
Introduzione alle basi di dati
GESTIONE DEI FILE Per poter mantenere disponibili i dati tra le diverse esecuzioni di un programma (persi-stenza dei dati) è necessario poterli archi-viare.
File ad accesso casuale o random
2000 Prentice Hall, Inc. All rights reserved. Capitolo 10 (Deitel) Strutture, unioni ed enumerazioni Sommario Introduzione Definire le strutture.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
1 Gestione dei File. 2 Perché i file? Sono strutture dati persistenti Sono solitamente memorizzati sui dischi –Si usano dall'interno dei programmi Realizzano.
Unità Didattica 3 Linguaggio C
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e stringhe Marco D. Santambrogio – Ver. aggiornata al 9 Agosto 2013.
Esercizi su File.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
2000 Prentice Hall, Inc. All rights reserved. Capitolo 11 (Deitel) Lelaborazione dei file Sommario Introduzione La gerarchia dei dati 11.3.
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Programmazione in linguaggio C
Programmazione Web PHP e MySQL 1. 2Programmazione Web - PHP e MySQL Esempio: un blog.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – Ver. aggiornata al 21 Maggio 2014.
Fabio Scotti – Università degli Studi – Laboratorio di programmazione per la sicurezza 1 Lezione 13 e 14 GESTIONE DEI FILE A) Nozioni sulla gestione dei.
1 Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( ) Laboratorio di programmazione Lezione 13 e 14 -
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
1 Chiamate di sistema Introduzione Errori : perror() Chiamate che lavorano su file.
Operatori di incremento e decremento
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Capitolo 14 Diapositiva 1 Linguaggio C – Guida alla programmazione 2/ed – A. Bellini, A. Guidi Copyright © The McGraw-Hill Companies srl Archiviare.
Transcript della presentazione:

Anno accademico Input e Output in C

Anno accademico Sommario Input e outputInput e output I flussi di I/O I flussi di I/O Luso di buffer Luso di buffer Apertura e chiusura di file Apertura e chiusura di file Lettura e scrittura di dati Lettura e scrittura di dati La selezione di un metodo di I/O La selezione di un metodo di I/O I/O non bufferizzato I/O non bufferizzato Laccesso diretto a file Laccesso diretto a file

Anno accademico Introduzione La gestione dellI/O su file è uno degli aspetti più complessi dei linguaggi di programmazione, perché strettamente correlato con le particolari modalità di accesso a file ed alle periferiche dettate dal sistema operativo difficoltà nella progettazione di servizi di I/O portabili bufferizzatoStoricamente, lapposita libreria di run time del C e la libreria di I/O di UNIX erano parzialmente sovrapposte: tuttavia, la libreria C tratta lI/O bufferizzato, contrariamente alla libreria UNIX Le funzioni ANSI di I/O sono tutte bufferizzate (con possibilità di modifica della dimensione del buffer) Le funzioni ANSI di I/O operano inoltre una distinzione tra accesso a file in modalità binaria o testuale; in ambiente UNIX la distinzione è poco significativa poiché UNIX tratta file binari e file di testo alla stessa stregua come sequenze di byte (in altri sistemi operativi, tale distinzione è invece importante)

Anno accademico I flussi di I/O 1 flussi streamIl linguaggio C non distingue tra periferiche e file su disco: in entrambi i casi le operazioni di I/O sono realizzate attraverso flussi o stream di I/O associati a file o periferiche Un flusso di I/O è una sequenza ordinata di byte: la lettura e la scrittura di un file o di una periferica implicano la lettura/ scrittura di dati da/su un flusso I flussi di I/O: i programmi C accedono ai dati memorizzati in file attraverso array monodimensionali di caratteri, detti flussi di I/O Flusso Flusso File File Sorgente C

Anno accademico I flussi di I/O 2 Per eseguire lI/O, è necessario associare un flusso ad un file o a una periferica FILE occorre dichiarare un puntatore alla struttura FILE FILEstdio.hLa struttura FILE, definita in stdio.h, è costituita da campi che contengono informazioni quali il nome del file, la modalità di accesso, il puntatore al prossimo carattere nel flusso FILEI campi della struttura FILE, istanziati allatto dellapertura di un flusso (o in fase di utilizzo), sono dipendenti dallim- plementazione e differiscono per sistemi operativi diversi

Anno accademico I flussi di I/O 3 FILE FILE puntatore a fileLe strutture FILE forniscono al sistema operativo le informazioni necessarie per la gestione dei file: lunico meccanismo di accesso ad un flusso è il puntatore alla struttura FILE, detto puntatore a file fopen()Il puntatore a file deve essere dichiarato nel programma, contiene lidentificatore del flusso restituito da una chiamata alla fopen(), e viene utilizzato per leggere, scrivere e chiudere il flusso Ciascun programma può aprire pi ù flussi simultaneamente, nel rispetto dei limiti imposti dalla particolare implemen- tazione

Anno accademico I flussi di I/O 4 FILE indicatore di posizione nel fileUno dei campi della struttura FILE è un indicatore di posizione nel file, che punta al successivo byte da leggere o scrivere: a fronte di operazioni di lettura/scrittura, il sistema operativo modifica conseguentemente lindicatore di posizione Lindicatore di posizione del file non può essere manipolato direttamente (in maniera portabile), ma può essere letto e modificato tramite funzioni di libreria, permettendo accessi al flusso non sequenziali Attenzione:Attenzione: il puntatore a file identifica un flusso aperto, che è connesso ad un file o a una periferica, lindicatore di posizione nel file identifica uno specifico byte allinterno di un flusso

Anno accademico I flussi standard flussi standard stdinstdoutstderrEsistono tre flussi standard, che vengono aperti automati- camente per ogni programma: stdin, stdout, stderr I flussi standard sono connessi al terminale, per default, ma molti sistemi operativi ne permettono la redirezione (ad es., è possibile inviare messaggi di errore ad un file per effettuare diagnostica) printf() scanf() stdinstdout freopen()Le funzioni printf() e scanf() utilizzano i flussi standard di I/O; possono essere utilizzate anche per fare I/O su/da file, ridirigendo stdin e stdout a file per mezzo della funzione freopen() fprintf() fscanf()Tuttavia, esistono le funzioni di libreria apposite, fprintf() e fscanf(), che permettono di specificare il flusso su cui operare

Anno accademico I formati testo e binario modalità testo binariaI dati possono essere acceduti in modalità testo o binaria: flusso testuale Un flusso testuale è composto da una sequenza di linee, concluse da newline (sistemi operativi diversi possono memorizzare linee con formati diversi, utilizzando un carattere differente di terminazione linea) flussi standard I flussi standard sono testuali formato binario In formato binario il compilatore non effettua alcuna interpre- tazione dei byte: i bit sono letti e scritti come un flusso continuo I flussi binari sono utilizzati quando è fondamentale preservare lesatto contenuto del file

Anno accademico Luso del buffer 1 Confrontate con la memoria centrale, le unità di memoria di massa sono estremamente lente: nei programmi, il tempo richiesto per accedere alle periferiche eccede largamente il tempo impiegato dalla CPU per i calcoli bufferizzazioneÈ di fondamentale importanza ridurre il numero di operazioni di lettura/scrittura, mediante tecniche di bufferizzazione bufferUn buffer è unarea di memoria in cui i dati sono memorizzati temporaneamente, prima di essere inviati a destinazione Mediante luso di buffer, il sistema operativo può limitare il numero di accessi effettivi alla memoria di massa Tutti i sistemi operativi utilizzano buffer per leggere/scrivere su unità di I/O: laccesso a disco, per esempio, avviene con granularità di blocco, con blocchi di dimensione 512/4096 byte

Anno accademico Luso del buffer 2 bufferizzazione a linee bufferizzazione a blocchiLe librerie di run time del C contengono un ulteriore livello di bufferizzazione che può assumere due forme distinte: bufferizzazione a linee e bufferizzazione a blocchi Nella bufferizzazione a linee, il sistema immagazzina i caratteri fino a quando si incontra un newline (o il buffer è pieno), inviando lintera linea al sistema operativo (ciò che accade per linserimento da tastiera) Nella bufferizzazione a blocchi, il sistema immagazzina i caratteri fino a riempire un blocco, trasferendolo quindi al sistema operativo Tutti i flussi di I/O a file utilizzano una bufferizzazione a bloc- chi, i flussi riferiti a terminale sono dipendenti dal sistema operativo, ma sono o non bufferizzati o bufferizzati a linee

Anno accademico Luso del buffer 3 gestore di bufferLe librerie standard di I/O del C comprendono un gestore di buffer che mantiene il buffer in memoria il più a lungo possibile: se si accede alla stessa porzione di un flusso più volte, si ha alta probabilità che il flusso sia stato mantenuto nella memoria centrale (si possono verificare problemi di accesso concorrente, gestibili via sistema operativo, se il file è condiviso da più processi) fflush()Sia nel caso di bufferizzazione a righe che a blocchi, è possibile richiedere esplicitamente al sistema operativo di forzare linvio del buffer a destinazione in un momento qualsiasi, per mezzo della funzione fflush() Il C consente di personalizzare il meccanismo di bufferizzazione (modificando le dimensioni del buffer) fino ad eliminarla, ponendo la dimensione del buffer a zero

Anno accademico Il file header stdio.h stdio.hPer utilizzare le funzioni di I/O è necessario includere il file header stdio.h che contiene: Le dichiarazioni dei prototipi di tutte le funzioni di I/O FILE La dichiarazione della struttura FILE stdinstdoutstderrEOF Le macro costanti, come stdin, stdout, stderr, EOF EOF EOF corrisponde al valore restituito dalle funzioni di I/O in corrispondenza dellidentificatore di fine file Nota: NULL stddef.hNota: La definizione di NULL, per lANSI C, è invece contenuta nel file stddef.h #ifndef NULL #define NULL (void *) 0 #endif

Anno accademico La gestione degli errori EOFOgni funzione di I/O restituisce un valore speciale in caso di errore: alcune restituiscono zero, altre un valore diverso da zero o EOF FILEPer ogni flusso aperto, esistono due campi booleani nella struttura FILE che registrano condizioni di errore o di fine file feof() ferror()Si può accedere ai campi di fine file e di errore utilizzando le funzioni feof() e ferror() clearerr()La funzione clearerr() pone entrambi i campi a zero include define ERR_FLAG 1 define EOF_FLAG 2 char stream_stat(fp) FILE *fp; { /* se nessun campo booleano è alterato, * stat vale 0; se il solo campo di errore * è alterato, stat vale 1; se il solo * campo di fine file è alterato, stat * vale 2; se sono alterati entrambi, stat * vale 3 */ char stat = 0; if (ferror(fp)) stat |= ERR_FLAG; if (feof(fp)) stat |= EOF_FLAG; clearerr(fp); return stat; }

Anno accademico Apertura e chiusura di file 1 fopen()Prima di poter accedere al contenuto di un file, è necessario aprirlo tramite la funzione fopen(), che prevede due parametri: il nome del file e la modalità di accesso Esistono due insiemi di modalità di accesso, per i flussi testuali e per i flussi binari r Apre un file testuale esistente in lettura, posizionandosi allinizio del file; se il file non esiste, la funzione ritornerà il codice di errore NULL w Crea un nuovo file testuale e lo apre in scrittura, posizionandosi allinizio del file; se il file esiste, i dati precedenti vengono eliminati a append Apre un file testuale esistente in modalità append ; la scrittura può avvenire solo alla fine del file; se il file non esiste verrà creato automaticamente, in caso contrario il contenuto del file preesistente verrà mantenuto rr Apre un file testuale esistente in lettura e scrittura, posizionandosi allinizio del file; se il file non esiste, la funzione ritornerà il codice di errore NULL ww Crea un nuovo file testuale e lo apre in lettura e scrittura aa Apre un file testuale esistente o ne apre uno nuovo in modalità append; la lettura può avvenire in una posizione qualsiasi del file, la scrittura solo alla fine

Anno accademico Apertura e chiusura di file 2 b rbLe modalità binarie differiscono per laggiunta di una b (es., rb ) fopen()La funzione fopen() restituisce un puntatore a file, utilizzabile per accedere successivamente al file aperto Proprietà di file e flussi rispetto alle modalità di apertura della fopen() rwa r w a Il file deve esistere prima dellapertura ** Il file preesistente viene reinizializzato ** Possibilità di lettura del flusso **** Possibilità di scrittura sul flusso ***** Possibilità di scrittura solo alla fine **

Anno accademico Apertura e chiusura di file 3 Esempio: testEsempio: Funzione che apre un file testuale, denominato test, con accesso in lettura Note:Note: fprintf() printf() La funzione fprintf() è analoga alla printf(), eccettuato un parametro aggiuntivo, che identifica il flusso di uscita open_test() test La funzione open_test() è poco flessibile, perché permette lapertura del solo file test e soltanto per accessi in lettura include FILE *open_test() { /* restituisce un puntatore ad una struttura FILE */ FILE *fp; fp fopen(test, r); if (fp NULL) fprintf(stderr,Errore nellapertura del file test\n); return fp; }

Anno accademico Apertura e chiusura di file 4 include FILE *open_file(file_name, access_mode) char *file_name, *access_mode; { FILE *fp; if ((fp fopen(file_name, access_mode)) NULL) fprintf(stderr, Errore nellapertura del file %s \ con modalità di accesso %s\n, file_name, access_mode); return fp; } open_file() fopen()La funzione open_file() è equivalente alla fopen(), a meno della notifica esplicita di errore se il file non può essere aperto

Anno accademico Apertura e chiusura di file 5 fclose() FILEPer chiudere un file viene utilizzata la funzione fclose(), con argomento il puntatore alla struttura FILE da chiudere FILELa chiusura del file provoca il rilascio della struttura FILE, per la successiva allocazione ad altri file La chiusura del file forza anche la scrittura del contenuto del buffer associato al flusso Dato che tutti i sistemi operativi stabiliscono un numero massimo di flussi aperti contemporaneamente, è buona norma chiudere i file quando se ne è conclusa lelaborazione Tutti i flussi aperti vengono comunque chiusi dal sistema operativo quando il programma termina correttamente (nel caso di terminazione anomala, il comportamento non è standardizzato)

Anno accademico Lettura e scrittura di dati letturascritturaSu un file aperto è possibile utilizzare il puntatore a file per svolgere operazioni di lettura e scrittura granularitàLe operazioni di accesso al file possono essere effettuate su oggetti di granularità diversa, in particolare a livello di… …carattere …linea …blocco fseek() rewind() fflush()Qualsiasi sia la granularità, è impossibile leggere da un flusso e quindi scrivere sullo stesso flusso senza che fra le due operazioni venga effettuata una chiamata a fseek(), rewind() o fflush() fseek() rewind() fflush()Le funzioni fseek(), rewind() e fflush() sono le uniche funzioni di I/O che forzano la scrittura del buffer sul flusso

Anno accademico Lettura e scrittura per caratteri 1 Esistono due modalità per la lettura/scrittura di caratteri da un flusso getc() getc() : macro che legge un carattere da un flusso fgetc() getc() fgetc() : analoga a getc(), ma realizzata come una funzione putc() putc() : macro che scrive un carattere su un flusso fputc() putc() fputc() : analoga a putc(), ma realizzata come una funzione getc() putc()Le macro getc() e putc(), in quanto tali, sono normalmente molto più veloci delle analoghe funzioni fgetc() fputc()Tuttavia, se un parametro attuale contiene operatori che implicano effetti collaterali, fgetc() ed fputc() sono preferibili Per le altre macro di libreria, lo standard ANSI prevede che gli argomenti possano comparire una sola volta nel corpo della macro, per evitare (il sommarsi degli) effetti collaterali

Anno accademico Lettura e scrittura per caratteri 2 Esempio:Esempio: Funzione che copia il contenuto di un file in un altro Note:Note: Entrambi i file vengono acceduti in modalit à binaria getc() La macro getc() legge il prossimo carattere dal flusso specificato e sposta lindicatore di posizione del file avanti di un elemento ad ogni chiamata getc() feof() In modalit à binaria, non è possibile interpretare il valore di ritorno della getc() per de- cretare la fine del file: feof() invece non presenta ambiguit à include define FAIL 0 define SUCCESS 1 int copy_file(infile, outfile) char *infile, *outfile; { FILE *fp1, *fp2; if ((fp1 fopen(infile, rb)) NULL) return FAIL; if ((fp2 fopen(outfile, wb)) NULL) { fclose(fp1); return FAIL; } while (!feof(fp1)) putc(getc(fp1), fp2); fclose(fp1); fclose(fp2); return SUCCESS; }

Anno accademico Lettura e scrittura per linee 1 fgets() fputs()Esistono due funzioni di I/O orientate alle linee, fgets() ed fputs() fgets()Il prototipo per la funzione fgets() è char *fgets(char *s, int n, FILE *stream); Gli argomenti hanno il seguente significato: s s : puntatore al primo elemento dellarray in cui vengono memorizzati i caratteri letti n n : numero massimo dei caratteri da leggere stream stream : puntatore al flusso da cui leggere fgets() \0 NULLLa funzione fgets() legge caratteri fino ad un newline, la fine del file o il numero massimo specificato di caratteri, inserendo automaticamente un carattere \0 dopo lultimo carattere scritto nellarray; restituisce NULL se incontra la fine del file, altrimenti restituisce il primo argomento

Anno accademico Lettura e scrittura per linee 2 fputs()La funzione fputs() scrive larray identificato dal primo argomento nel flusso identificato dal secondo argomento gets() stdinfgets() \0La differenza fondamentale fra gets() (che legge da stdin ) ed fgets() è che la seconda inserisce nellarray (prima del \0 finale) anche il carattere di newline che delimita la linea fgets() gets() EOFInoltre fgets() permette la specifica del numero massimo dei caratteri da leggere, mentre gets() procede sempre fino ad un terminatore (newline o EOF )

Anno accademico Lettura e scrittura per linee 3 Note: Note: fgets() Il file è aperto in modalit à testua- le per accedere ai dati a livello di linea, altrimenti fgets() potreb- be operare in modo scorretto, cercando caratteri di newline non presenti nel file (il terminatore di linea può essere diverso per si- stemi operativi diversi) fgets() fgets(), invece, si adegua alle caratteristiche del sistema opera- tivo specifico copy_file() fgets() fputs() fgetc() fputc() La funzione copy_file() per li- nee è pi ù lenta della versione per caratteri, poich é fgets() ed fputs() sono realizzate per mezzo di fgetc() ed fputc() (meno efficienti delle analoghe macro) include define FAIL 0 define SUCCESS 1 define LINESIZE 100 int copy_file(infile, outfile) char *infile, *outfile; { FILE *fp1, *fp2; char line[LINESIZE]; if ((fp1 fopen(infile, r)) NULL) return FAIL; if ((fp2 fopen(outfile, w)) NULL) { fclose(fp1); return FAIL; } while (fgets(line,LINESIZE 1,fp1) ! NULL) fputs(line, fp2); fclose(fp1); fclose(fp2); return SUCCESS; }

Anno accademico Lettura e scrittura per blocchi 1 bloccoUn blocco può essere immaginato come un array: quando si legge o si scrive un blocco è necessario specificare il numero di elementi del blocco e la dimensione di ognuno di essi fread() fwrite()Le due funzioni orientate alla gestione dei blocchi sono fread() e fwrite() fread()Il prototipo per la funzione fread() è int fread(void *ptr,int size,int nmemb,FILE *stream); Gli argomenti hanno il seguente significato: ptr ptr : puntatore ad un array in cui vengono memorizzati i dati size size : dimensione di ogni elemento dellarray nmemb nmemb : numero di elementi da leggere stream stream : puntatore a file

Anno accademico Lettura e scrittura per blocchi 2 fread()La funzione fread() restituisce il numero di elementi effettivamente letti, che dovrebbe coincidere con il terzo argomento, a meno di errori o di condizioni di fine file fwrite()La funzione fwrite() ha gli stessi argomenti, ma scrive nel flusso gli elementi contenuti nellarray copy_file()La funzione copy_file() può essere realizzata anche con granularit à di blocco: fread() La condizione di fine file è controllata confrontando il numero degli elementi letti, restituito da fread(), con il valore specificato nella lista degli argomenti: se sono diversi si ha una condizione di fine file o di errore ferror() La funzione ferror() viene utilizzata per stabilire quale condizione si è verificata

Anno accademico Lettura e scrittura per blocchi 3 while ((num_read fread(block,sizeof(DATA), BLOCKSIZE,fp1)) BLOCKSIZE) fwrite(block,sizeof(DATA),num_read,fp2); if (ferror(fp1)) { printf(Errore in lettura del \ file %s\n,infile); fclose(fp1); fclose(fp2); return FAIL; } fclose(fp1); fclose(fp2); return SUCCESS; } include define FAIL 0 define SUCCESS 1 define BLOCKSIZE 512 typedef char DATA; int copy_file(infile, outfile) char *infile, *outfile; { FILE *fp1, *fp2; DATA block[BLOCKSIZE]; int num_read; if ((fp1 fopen(infile, rb)) NULL) { printf(Errore nellapertura del file %s \ in input\n, infile); return FAIL; } if ((fp2 fopen(outfile, wb)) NULL) { printf(Errore nellapertura del file %s \ in output\n, outfile); fclose(fp1); return FAIL; }

Anno accademico La selezione di un metodo di I/O 1 putc()getc() read() write()Le macro putc() e getc() sono le pi ù veloci, ma la maggior parte dei sistemi operativi è in grado di realizzare operazioni di I/O su blocchi ancora pi ù efficienti (ad es., read() e write() in UNIX) fgets() fputs()Talvolta occorre privilegiare la semplicit à allefficienza: fgets() e fputs(), ad esempio, sono lente, ma particolarmente adatte nei casi in cui sia necessario analizzare linee Funzione che conta il numero di linee di un file include define MAX_LINE_SIZE 120 int lines_in_file(fp) FILE *fp; { char buf[MAX_LINE_SIZE]; int line_num 0; rewind(fp); /* sposta lindicatore di posizione allinizio del file */ while (fgets(buf,MAX_LINE_SIZE,fp)! NULL) line_num ; return line_num; }

Anno accademico La selezione di un metodo di I/O 2 Ultimo, ma non meno importante, fattore da considerare nella scelta di un metodo di I/O è la portabilità, fondamen- tale non tanto nella scelta del tipo di I/O (granularità a caratteri, linee o blocchi), ma nella scelta della modalità testo o binaria Se il file contiene dati testuali (codice sorgente o documenti), la modalità testo e laccesso per linee sono da privilegiare Se i dati sono numerici e non sono strutturati per linee, è preferibile la modalità binaria, con accesso per caratteri o per blocchi (codice eseguibile)

Anno accademico I/O non bufferizzato 1 Le librerie di run time del C consentono di modificare la dimensione del buffer: tale possibilit à deve essere utilizzata con attenzione, dato che la dimensione del buffer dovrebbe essere ottima per il particolare sistema operativo Talvolta, è tuttavia necessario eliminare completamente la bufferizzazione, tipicamente quando si vogliono elaborare immediatamente i dati di input setbuf() setvbuf()Per eliminare la bufferizzazione ci si può avvalere delle funzioni setbuf() e setvbuf() setbuf() setbuf()La funzione setbuf() richiede due parametri: un puntatore a file, ed un puntatore ad un array di caratteri da utilizzare come nuovo buffer; se tale puntatore è nullo, la bufferizzazione viene eliminata; setbuf() non restituisce valori setbuf(stdin,NULL);

Anno accademico I/O non bufferizzato 2 setvbuf()La funzione setvbuf() richiede due parametri aggiuntivi, che permettono di specificare la tipologia di bufferizzazione (per linee, per blocchi, o assente) e la dimensione dellarray da utilizzare come buffer stdio.hLa tipologia di bufferizzazione va specificata mediante uno dei tre simboli definiti in stdio.h : _IOFBF _IOFBF : bufferizzazione per blocchi _IOLBF _IOLBF : bufferizzazione per linee _IONBF _IONBF : bufferizzazione assente La funzione restituisce un valore diverso da zero se completata correttamente, zero se non è in grado di soddisfare la richiesta setvbuf(stdin,NULL,_IONBF,0);

Anno accademico Laccesso diretto a file 1 fseek() ftell()In C, le funzioni per laccesso diretto a file sono fseek() e ftell() fseek()La funzione fseek() sposta lindicatore di posizione del file a un carattere specificato nel flusso fseek()Il prototipo della fseek() è int fseek(FILE *stream,long int offset,int whence) dove: stream stream : puntatore a file offset offset : numero di caratteri di spostamento whence whence : posizione di partenza da cui calcolare lo spostamento whence stdio.hLargomento whence può assumere uno dei tre seguenti valori, definiti in stdio.h SEEK_SET SEEK_SET : inizio del file SEEK_CUR SEEK_CUR : posizione corrente dellindicatore SEEK_END SEEK_END : fine del file

Anno accademico Laccesso diretto a file 2 Esempio:Esempio: Listruzione stat fseek(fp,10,SEEK_SET); sposta lindicatore di posizione del file al carattere 10 del flusso (lundicesimo), che sarà il prossimo elemento letto o scritto fseek()La fseek() restituisce zero se la richiesta è corretta, un valore diverso da zero altrimenti Esempio:Esempio: Listruzione stat fseek(fp,1,SEEK_END); fp non è lecita se fp è aperto in sola lettura, perché sposta lindicatore oltre la fine del file ftell()Per flussi binari, lo spostamento può essere un qualsiasi numero intero che non sposti lindicatore al di fuori del file; per flussi testuali, deve essere zero o un valore restituito dalla ftell()

Anno accademico Laccesso diretto a file 3 ftell()La funzione ftell() richiede, come unico argomento, un puntatore a file e restituisce la posizione corrente dellindi- catore di posizione nel file ftell()La posizione restituita da ftell() si intende relativa allinizio del file… …per flussi binari rappresenta il numero di caratteri dallinizio del file alla posizione corrente fseek() …per flussi testuali rappresenta un valore dipendente dallimplementazione, significativo solo se utilizzato come parametro per la fseek() cur_pos ftell(fp); if (search(string) FAIL) fseek(fp,cur_pos,SEEK_set); Se la ricerca di una certa stringa nel file fallisce, lindicatore di posizione nel file viene riportato al valore originale

Anno accademico Esempio: dimensione del file /* Determinazione del numero di caratteri di un file con fseek e ftell */ include main(int argc, char **argv) { FILE *fp; long n; if (argc<2) printf(File non specificato\n); else { fp fopen(argv[1], rb); /* apertura del file */ if (fp ! NULL) { fseek(fp, 0, SEEK_END); /* puntatore alla fine del file */ n ftell(fp); /* lettura posizione del puntatore */ fclose(fp); printf(Dimensione del file %ld\n, n); } else printf(Errore: il file %s non esiste, argv[1]); }