DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio –...

35
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File File Marco D. Santambrogio – [email protected] Ver. aggiornata al 15 Maggio 2013

Transcript of DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio –...

Page 1: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

FileFile

Marco D. Santambrogio – [email protected]. aggiornata al 15 Maggio 2013

Page 2: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

ObiettiviObiettivi

• Alcuni problemi aperti Il main() Allocazione dinamica della memoria Il salvataggio dei dati

• File File e OS File in C

2

Page 3: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

3

Page 4: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

HowTo: compilare ed eseguireHowTo: compilare ed eseguire

• Scritto e salvato il file sorgente (e.g., sul Desktop, nel file primo.c),

• Dobbiamo compilare ed eseguire un programma utilizzando una shell (e.g., bash)$ cd Desktop$ gcc primo.c –o exe$ ./exe

4

• Per poter eseguire il nostro programma, bisogna tradurlo in codice macchina Questa operazione viene eseguita dal compilatore (e.g.,

gcc)

Page 5: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

I comandi da shellI comandi da shell

$ cd Desktop$ gcc primo.c –o exe

•Cosa vi è di particolare in $ cd Desktop $ gcc primo.c –o exe

•Quale è il “comando”? cd, gcc

•Cosa sono Desktop e primo.c?

5

Page 6: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Passaggio di parametri al Passaggio di parametri al mainmain

6

Page 7: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Ma ancora…Ma ancora…

$ cd Desktop$ gcc primo.c –o exe

•Quanti parametri passo a cd ? 1: Desktop

•Quanti parametri passo a gcc? 3: primo.c –o exe

7

Page 8: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Ma quanti parametri posso Ma quanti parametri posso passare?passare?

8

Page 9: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Vediamo tutti i Vediamo tutti i parametri…parametri…

9

Page 10: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

I programmi che abbiamo I programmi che abbiamo considerato finora….considerato finora….

• Richiedono di conoscere a priori le dimensioni dei dati da elaborare (es. per un array bisogna sempre specificare la dimensione a tempo di compilazione) Strutture dati statiche Soluzione: strutture dati dinamiche

• Perdono dati di ingresso, risultati intermedi e risultati finali al termine dell’esecuzione Volatilità delle variabili Soluzione: file

10

Page 11: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Strutture dati dinamicheStrutture dati dinamiche

• Servono per i casi in cui non è possibile stimare a priori la dimensione massima di una struttura dati

• E’ possibile allocare la memoria a tempo di esecuzione; il numero massimo di elementi può addirittura variare durante l’esecuzione

• In C vengono realizzate attraverso l’uso dei puntatori...non approfondiremo oltre

11

Page 12: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Non si deve fare!!Non si deve fare!!

int funzione(int vet[], int n){

/*Errore n non e’ noto a compile time! */

int vettoreAusiliario[n];

}

12

Page 13: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

I fileI file

• I file sono contenitori di informazioni: sequenze di byte associate ad un nome

• Ci sono due tipi fondamentali di file: File Binari: sequenza di byte File Testuali: sequenza di caratteri, suddivisi in

linee terminate da un carattere di newline; • ciascun byte è la codifica ASCII di un carattere

alfanumerico (alcuni caratteri possono essere caratteri di controllo non printable)

• Memorizzati in modo permanente in memoria di massa Necessari come archivio di informazioni

persistenti, visto che la memoria di lavoro è invece volatile

13

Page 14: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

I file e il sistema operativoI file e il sistema operativo

• Gestiti dal sistema operativo (gestione del file system) Risolve la corrispondenza tra nome del

file e tracce/settori del disco in cui è memorizzato

Invia i comandi al driver del disco (interfaccia di I/O) per leggere da o scrivere su file (trasferimento tra memoria di massa e memoria centrale)

• Per organizzare in modo conveniente grandi quantità di file, questi sono raccolti in directory (cartelle)

14

Page 15: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Identificazione dei fileIdentificazione dei file

• Possono esistere più file con lo stesso nome, purché abbiano una collocazione diversa nell’albero dei direttori

• Pathname: descrive tutto il percorso nell’albero dei direttori per raggiungere il file Il direttorio radice (root) assume il nome dell’unità

disco, che nei PC è C: Es.: il file FILE3 nel direttorio Lisa ha pathname

• C:\user\lisa\FILE3• I file sono generalmente dotati di attributi

Data e ora di creazione o dell’ultima modifica Dimensioni espresse in numero di byte

• Il compito di gestire i file e caricarli nella memoria di lavoro, quando richiesto, è svolto dal sistema operativo

15

Page 16: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

File e programmi CFile e programmi C

• In C l’accesso ai file da parte di un programma avviene tramite le funzioni disponibili nella libreria stdio.h

• Le funzioni di libreria della stdio.h interagiscono con il sistema operativo per consentire l’accesso a file Al loro interno le funzioni di libreria

contengono delle chiamate a funzioni di sistema operativo

Sfruttano la chiamate al sistema operativo (dette primitive) per creare, cancellare, scrivere, leggere da file

16

Page 17: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Uso dei file in ambiente CUso dei file in ambiente C

• In ambiente C, per utilizzare un file all’interno di un programma è necessario:

• Aprire un “flusso di comunicazione”, cioè aprire il file

• Accedere a file in lettura e/o scrittura• Chiudere il “flusso di comunicazione”, cioè

chiudere il file

• Se un file viene aperto in una certa modalità (binario o testuale): Le operazioni sul file devono essere

effettuate in modo congruente, tenendo conto del tipo di file

Se creo un file in formato binario devo leggerlo sempre in formato binario

17

Page 18: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Apertura di un file 1/2Apertura di un file 1/2

• File * fopen(“nome_file”, “modalità”) è la funzione per l’apertura del file riceve in ingresso il nome del file da aprire e il modo in cui lo

si vuole aprire restituisce il puntatore al descrittore del file creato

• Alla chiamata della funzione il sistema operativo crea un nuovo descrittore di file nella

tabella dei file aperti inizializza i campi del descrittore restituisce il puntatore a tale descrittore. Questo puntatore

rappresenta il nome logico del file, associato al nome fisico indicato come parametro della fopen

una volta aperto il file, questo può essere acceduto indicando il solo nome logico

18

Page 19: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Apertura di un file 2/2Apertura di un file 2/2

• In un programma C, un file è rappresentato da un puntatore al descrittore del file

• Un programma C che utilizza un file deve dichiarare una variabile puntatore, ad esempio: FILE *fp;

• Il programma fa riferimento al file (nel suo complesso) tramite tale variabile (fp)

#include <stdio.h>main(){

FILE *fp;fp=fopen(“ordine.txt”, “r”)

………}

19

Page 20: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Flussi di comunicazione Flussi di comunicazione standardstandard• I file in realtà sono già stati utilizzati prima

• All’inizio dell’esecuzione di un programma C vengono automaticamente aperti 3 flussi di comunicazione standard rappresentati da 3 variabili implicite di tipo puntatore a FILE stdin: associato al file che rappresenta il dispositivo di

ingresso standard (tastiera) stdout: associato al file che rappresenta il dispositivo di

uscita standard (video) stderr: associato al file che rappresenta il dispositivo di

uscita standard (video)

• printf scrive sul file a cui fa riferimento il puntatore stdout

• scanf legge dal file cui fa riferimento stdin

20

Page 21: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Modalità di apertura di un Modalità di apertura di un filefile• “r”

sul file sarà possibile eseguire solo operazioni di lettura. Se il file non esiste, la funzione fopen restituisce il codice di errore NULL

• “w” sul file sarà possibile eseguire solo operazioni di scrittura ad inizio file Se il file non esiste viene automaticamente creato

• “r+” sul file sarà possibile eseguire sia operazioni di lettura che di scrittura Se il file non esiste, la funzione fopen restituisce il codice di errore NULL

• “w+” sul file sarà possibile eseguire sia operazioni di lettura che di scrittura. Se il file non esiste, viene automaticamente creato, in caso contrario il

contenuto preesistente del file viene perso (sovrascrittura)• “a”

sul file sarà possibile eseguire solo operazioni di scrittura in coda al file. Se il file non esiste viene automaticamente creato, altrimenti il contenuto

preesistente del file non viene perso• “rb, wb, rb+, wb+, ab+”

stesso significato di cui sopra ma per file binari

21

Page 22: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Chiusura di un fileChiusura di un file

• La chiusura di un file è possibile attaverso la funzione fclose

int fclose (FILE *fp)

• Riceve in ingresso il puntatore del file da chiudere

• Restituisce 0 se l’operazione è andata a buon fine !=0 se non è andata a buon fine

• Alla chiamata, il sistema operativo chiude il file referenziato dal puntatore assegna al puntatore il valore NULL libera l’elemento che conteneva il descrittore del file chiuso

22

Page 23: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Un primo esempioUn primo esempio

23

Page 24: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Gestione degli erroriGestione degli errori

• int feof(FILE *p) Restituisce

• !=0 se durante la lettura si incontra EOF• 0 se non si è incontrata la fine del file

Accedere ad un file in una zona oltre la fine del file è considerato errore

• int ferror(FILE *p) Restituisce

• !=0 se durante la lettura non si è verificato errore

• 0 se si è verificato errore

24

Page 25: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Formato dei file e Formato dei file e Lettura/scritturaLettura/scrittura

• La lettura e la scrittura devono essere operazioni simmetriche dipendono dal tipo di file

• La struttura delle informazioni inserite in un file sono definite da chi crea il file

• Se il file è testuale i caratteri letti/scritti possono essere soggetti ad interpretazione Per esempio il carattere ascii 10 indica il comando di “a capo” Questo carattere non viene letto o scritto ma viene attivato il comando che manda

a capo la prossima riga

• Se il file è binario i caratteri letti/scritti non sono interpretati Quindi se scrivo il carattere con codice ascii 10 in un file binario viene scritto

proprio il carattere con codice 10

25

Page 26: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Accesso SequenzialeAccesso Sequenziale

• Le operazioni di lettura e scrittura accedono al file in modo sequenziale, e mantengono traccia del punto in cui si è arrivati nella scrittura del file

• Dopo l’apertura, il puntatore è posizionato all’inizio del file, dopo si sposta di un numero di byte pari a quelli che sono stati letti (scritti) e trasferiti in (da) memoria centrale

• Se l’apertura di un file è in scrittura, in modalità “a” (append), allora dopo l’apertura il puntatore è posizionato a fine file

• La funzione feof(fp), indica se il file pointer è posizionato a fine file feof(fp) != 0 se il file pointer è posizionato a fine file feof(fp) == 0 negli altri casi

26

Page 27: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Lettura e scrittura di file Lettura e scrittura di file testuali 1/2testuali 1/2

• In un file testuale possono leggere e scrivere Un carattere per volta (fgetc, fputc) Un blocco formattato (fscanf, fprintf)

• int fgetc (FILE *fp) legge il prossimo carattere dal file specificato come

parametro

• int fputc (int c, FILE *fp) scrive sul file specificato come parametro il carattere

specificato come parametro

• Esistono anche le funzioni getc e putc Hanno lo stesso prototipo e sono equivalenti Hanno una diversa implementazioni

27

Page 28: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Lettura e scrittura di file Lettura e scrittura di file testuali 2/2testuali 2/2

• int fscanf(FILE *fp, stringa_controllo, variabili) Ha la stesso effetto della scanf ma legge da file La scanf è la fscanf in un cui fp punta a stdin

• int fprintf(FILE *fp, stringa_controllo, variabili) Ha la stesso effetto della printf ma scrive sul file La printf è la fprintf in un cui fp punta a stdout

• Tutte queste funzioni restituiscono EOF in caso di errore

28

Page 29: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Lettura e scrittura di blocchi di Lettura e scrittura di blocchi di bytebyte

• int fread (void *punt, dim_blocco, num_blocchi, FILE *fp) Legge dal file fp un numero di byte pari a

dim_blocco*num_blocchi e li memorizza nell’area di memoria puntata da punt

Restituisce il numero di byte letti

• int fwrite (void *punt, dim_blocco, num_blocchi, FILE *fp) Scrive sul file fp un numero di byte pari a

dim_blocco*num_blocchi letti dall’ area di memoria puntata da punt

Restituisce il numero di byte scritti

29

Page 30: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Accesso diretto ad un byte Accesso diretto ad un byte specificospecifico

• long int ftell(FILE *fp) Restituisce il valore dell’indicatore di posizione

del prossimo byte a cui si può accedere

• int fseek (FILE *fp, long offset,int refpoint) Sposta l’indicatore di posizione del prossimo

byte a cui accedere del valore di offset (positivo o negativo) a partire da refpoint

Restituisce 0 se l’operazione è possibile

• rewind(FILE *fp) sposta l’indicatore di posizione all’inizio del file

30

Page 31: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Creiamo e scriviamo su un fileCreiamo e scriviamo su un file

31

La funzione fputs() scrive la stringa s su stream.

Page 32: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

E se volessimo sfruttare argv?E se volessimo sfruttare argv?

32

Page 33: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Legge e mostra a video un file di Legge e mostra a video un file di testotesto

33

La funzione putchar() scrive il carattere c su stdout.

Page 34: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Lettura sequenziale di un Lettura sequenziale di un filefile

#include <stdio.h>main(){

int account; char name[ 30 ]; double balance; FILE *cfPtr; /* cfPtr = clients.dat file pointer */

cfPtr = fopen( "clients.dat", "r" );

if ( cfPtr == NULL ) printf( "File could not be opened\n" ); else { printf( "%-15s %-15s %s\n", "Account", "Name", "Balance" ); fscanf( cfPtr, "%d%s%lf", &account, name, &balance ); while ( !feof( cfPtr ) ) { printf( "%-15d%-15s%7.2f\n", account, name, balance ); fscanf( cfPtr, "%d%s%lf", &account, name, &balance ); } fclose( cfPtr ); }

}

34

Clients.dat

Page 35: DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE File Marco D. Santambrogio – marco.santambrogio@polimi.it Ver. aggiornata al 15 Maggio 2013.

DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE

Fonti per lo studio + Fonti per lo studio + CreditsCredits• Fonti per lo studio

http://digilander.libero.it/uzappi/C/

• Credits Gianluca Palermo