Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito...

16
Programmazione Avanzata Java e C 20132014 25 novembre 2013 Lezione 26 I file e altre cose uAli 1 © 2013 2016 Riccardo Cassinis TuF i diriF riservaA Programmazione Avanzata Java e C Lezione 26 I file e altre cose utili 25 novembre 2013 Formatted vs. unformatted I/O Formatted write: Le variabili vengono convertite in caratteri alfanumerici secondo le specifiche di formato. Ogni carattere alfanumerico viene scritto in un byte del file. fprintf (fp, "%d\n", 5765) Unformatted write: size_t fwrite( const void * ptr, size_t size, size_t nitems, FILE * stream); fwrite (pb, N, M, f); scrive sul file f N byte per M volte, copiandoli a partire dall'indirizzo pb della memoria. Restituisce il numero di byte effettivamente scritti. 25 novembre 2013 2 Lezione 26 I file e altre cose utili

Transcript of Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito...

Page 1: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

1  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Programmazione Avanzata Java e C

Lezione 26 I file e altre cose utili

25 novembre 2013

Formatted vs. unformatted I/O

ð Formatted write: ●  Le variabili vengono convertite in caratteri alfanumerici

secondo le specifiche di formato. Ogni carattere alfanumerico viene scritto in un byte del file.

●  fprintf (fp, "%d\n", 5765) ð Unformatted write:

●  size_t fwrite( const void * ptr, size_t size, size_t nitems, FILE * stream);"

●  fwrite (pb, N, M, f);"●  scrive sul file f N byte per M volte, copiandoli a partire

dall'indirizzo pb della memoria. ●  Restituisce il numero di byte effettivamente scritti.

25 novembre 2013 2 Lezione 26 I file e altre cose utili

Page 2: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

2  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Unformatted read

ð size_t fread(void * ptr, size_t size, size_t nitems, FILE *stream);"

ð fread (pb, N, M, f);"ð  legge dal file f N byte per M volte, memorizzandoli a partire

dall'indirizzo pb della memoria. ð Come al solito è responsabilità del programmatore accertarsi che

la memoria occorrente sia stata allocata.

25 novembre 2013 3 Lezione 26 I file e altre cose utili

Altre funzioni per i file

ð int fseek(FILE *stream, long offset, int whence); ð long ftell(FILE *stream); ð void rewind(FILE *stream);

25 novembre 2013 4 Lezione 26 I file e altre cose utili

Page 3: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

3  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Fseek:

ð DESCRIPTION

ð The fseek() function sets the file position indicator for the stream pointed to by stream. The new position, measured in bytes, is obtained by adding offset bytes to the position specified by whence. If whence is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset is relative to the start of the file, the current position indicator, or end-of-file, respectively. A successful call to the fseek() function clears the end-of-file indicator for the stream and undoes any effects of the ungetc(3) and ungetwc(3) functions on the same stream.

25 novembre 2013 5 Lezione 26 I file e altre cose utili

Ftell:

ð DESCRIPTION

ð The ftell() function obtains the current value of the file position indicator for the stream pointed to by stream.

25 novembre 2013 6 Lezione 26 I file e altre cose utili

Page 4: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

4  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Errori nei file:

ð Vedere i manuali! ð errno

●  errno - number of last error ð ferror()

●  int ferror(FILE *stream); ð perror()

●  Vedere il manuale!

25 novembre 2013 7 Lezione 26 I file e altre cose utili

Un intermezzo per “smanettoni”

1 0 1 1 0 0 0 1

Lezione 26 I file e altre cose utili 25 novembre 2013

Page 5: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

5  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Un intermezzo per “smanettoni”

0 1 1 0 1 0 0 0

Lezione 26 I file e altre cose utili 25 novembre 2013

Operatori utili:

25 novembre 2013 10

ð & (operatore binario): esegue l’AND logico bit a bit fra i suoi argomenti. ●  Esempio:

•  0100 1101 1111 0101 & •  0000 0111 1111 1010 = •  0000 0101 1111 0000

ð Esistono anche ●  | (OR bit a bit) ●  ^ (XOR bit a bit) ●  ~ (NOT bit a bit)

ð Non confondere con && e ||, mi raccomando!

Lezione 26 I file e altre cose utili

Page 6: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

6  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Altri operatori utili:

25 novembre 2013 11

ð << (operatore binario): fa “scorrere” a sinistra il primo argomento del numero di posizioni indicate dal secondo ●  Esempio:

•  0100 1101 1111 0101 << 3 •  0110 1111 1010 1000

ð Esiste anche ●  >> (scorrimento a destra)

Lezione 26 I file e altre cose utili

Il tema proposto

25 novembre 2013 12

ð Scrivere un programma in C che: ●  Accetti da tastiera un numero intero espresso in base 10; ●  Lo visualizzi; ●  Lo visualizzi in base 16 (usando lo specificatore %x); ●  Lo visualizzi in base 2, nella forma:

xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx usando la funzione stampa_binario

●  Ripeta il tutto, finché non viene introdotto il numero 0. ð Le sole funzioni di libreria consentite sono scanf e

printf.

Lezione 26 I file e altre cose utili

Page 7: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

7  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Ragionamenti a ruota libera

25 novembre 2013 13

ð Suddividiamo il problema: ð Loop “esterno”

●  while (1) do {…}"ð Contenuto del loop:

●  Acquisisci il numero ●  (Controlla che sia veramente un numero) ●  Se è 0, esci ●  Visualizzalo ●  Visualizzalo in esadecimale ●  Visualizzalo in binario

Lezione 26 I file e altre cose utili

La conversione

25 novembre 2013 14

ð L’algoritmo per la conversione è noto: ●  Prendere il numero… ●  Dividerlo per due… ●  Segnare il resto…

Lezione 26 I file e altre cose utili

Page 8: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

8  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Un operatore utile:

25 novembre 2013 15

ð % (operatore binario): restituisce il primo argomento modulo il secondo, ovvero il resto della divisione fra i due argomenti ●  Esempio:

•  10 % 4 = 2 •  20 % 4 = 0

ð Ricordare: ●  La divisione fra interi dà un risultato troncato, non

approssimato!

Lezione 26 I file e altre cose utili

La conversione

25 novembre 2013 16

ð Ma dobbiamo veramente fare una conversione? ð Serve veramente? ð Come sono rappresentati nel calcolatore i numeri interi?

Lezione 26 I file e altre cose utili

Page 9: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

9  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Dal concetto di oggetto in Java…

ð Spesso è utile “aggregare” insieme diversi dati: ð Coordinate di un punto

●  int X ●  int Y ●  int Z

ð Descrizione di uno studente ●  char cognome [50] ●  char nome [50] ●  int matricola ●  int anno_di_corso

25 novembre 2013 Lezione 26 I file e altre cose utili 17

…alle struct

ð Una struct è un tipo di dato aggregato che, a differenza del vettore ●  Ha nomi diversi per i vari elementi ●  Può essere composto da elementi di tipo e dimensione diversa

ð Vediamo esempi pratici

25 novembre 2013 Lezione 26 I file e altre cose utili 18

Page 10: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

10  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Un primo semplice esempio

ð Definiamo un oggetto che rappresenta un punto su un piano

Struct1

25 novembre 2013 Lezione 26 I file e altre cose utili 19

Anche le funzioni…

ð Possono avere un tipo definito da noi

struct2

25 novembre 2013 Lezione 26 I file e altre cose utili 20

Page 11: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

11  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Se lo troviamo comodo…

ð Possiamo dare un nostro nome a qualunque tipo di dato, anche a quelli già definiti

struct3

25 novembre 2013 Lezione 26 I file e altre cose utili 21

Un esempio più completo

ð Da sviscerare in ogni particolare, soprattutto per quanto riguarda quella definizione “static”

struct4

25 novembre 2013 Lezione 26 I file e altre cose utili 22

Page 12: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

12  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Problemi interessanti:

ð Dato un (lungo) file di testo: ð Contare quanti caratteri contiene ð Contare quante frasi, righe, parole contiene ð Trovare la parola più lunga ð Trovare quante volte compare una determinata parola ð …

ð Tutte queste sono potenziali domande di esame!

25 novembre 2013 Lezione 26 I file e altre cose utili 23

Ma questi esercizi…

ð Fanno calcoli che richiedono la memorizzazione di poche variabili semplici, ma non è sempre così:

ð Disegnare un istogramma delle occorrenze delle 20 parole più frequentemente usate

ð Dobbiamo per forza memorizzare ogni parola usata, accoppiandola ad un contatore, ma a priori non sappiamo: ●  Quante parole ci sono ●  Quante parole diverse ci sono ●  Quanti caratteri ha la parola più lunga

ð Inoltre, non possiamo pretendere di trovare tutta memoria contigua.

25 novembre 2013 Lezione 26 I file e altre cose utili 24

Page 13: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

13  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Proviamo a fare le cose dinamicamente

ð L’esistenza dei puntatori ci permette di utilizzare una comodissima funzione del sistema operativo, che è in grado di allocare zone di memoria durante l’esecuzione del nostro programma, e non prima come si è fatto finora.

ð Questa funzione è la stessa che viene utilizzata automaticamente per tutte le variabili che hanno una classe di memorizzazione temporanea, ma…

ð Le variabili allocate così cessano di esistere solo quando lo decidiamo noi.

25 novembre 2013 Lezione 26 I file e altre cose utili 25

Utilità pratica dell’allocazione dinamica

ð Spesso a priori non si sa… ●  Quanti dati ci sono ●  Quanto è lungo ogni dato

25 novembre 2013 Lezione 26 I file e altre cose utili 26

Page 14: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

14  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Sarebbe bello se fosse così:

25 novembre 2013 27

B I A N C H I Ø R O S S I Ø V E R D I Ø Z O F F Ø M A R C H I Ø B I S I O Ø M E N S I Ø R I C C I Ø C O S T A Ø T A S S I Ø L E O N I Ø

B I A N C H I Ø R O S S I Ø V E R D I Ø Z O F F Ø M A R C H I Ø B I S I O Ø M E N S I Ø R I C C I Ø C O S T A Ø T A S S I Ø L E O N I Ø

char vettore [11][8]

Lezione 26 I file e altre cose utili

Ma invece spesso è così:

25 novembre 2013 28

char vettore [10][34];

340 BYTE, QUASI TUTTI SPRECATI!

Z O F F Ø R O S S I Ø B I A N C H I Ø V E R D I Ø B I S I O Ø C O S T A Ø M E N S I Ø T A S S I Ø L E O N I Ø S E R B E L L O N I M A Z Z A N T I V I E N D A L M A R E Ø

Lezione 26 I file e altre cose utili

Page 15: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

15  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

La soluzione:

25 novembre 2013 29

char * vettore [10];

Z O F F Ø

R O S S I Ø

B I A N C H I Ø

V E R D I Ø

B I S I O Ø

C O S T A Ø

M E N S I Ø

T A S S I Ø

L E O N I Ø

S E R B E L L O N I M A Z Z A N T I V I E N D A L M A R E Ø

Lezione 26 I file e altre cose utili

La funzione malloc

25 novembre 2013 30

ð La funzione malloc svolge le seguenti funzioni: ●  Cerca una zona di memoria contigua grande quanto

l’argomento (in byte) ●  La alloca ad uso esclusivo di chi la ha chiesta ●  Restituisce un puntatore alla prima cella della zona allocata ●  Restituisce NULL se l’operazione è fallita ●  Il puntatore restituito è di tipo void:

void *malloc (size_t size)"

●  Definita in stdlib.h"

memdinamica2

Lezione 26 I file e altre cose utili

Page 16: Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito webmail/Dida/2013/PAJC... · 2015. 10. 22. · Lezione+26+Ifile+e+altre+cose+uAli++ ©+2013+5+2016+Riccardo+Cassinis+5+TuF+i+diriF+riserva+

Programmazione  Avanzata  Java  e  C  2013-­‐2014  

25  novembre  2013  

Lezione  26  I  file  e  altre  cose  uAli    

16  ©  2013  -­‐  2016  Riccardo  Cassinis  -­‐  TuF  i  diriF  riservaA  

Perché void *malloc?

ð Semplicemente perché quando viene chiamata, nessuno sa quale tipo di dato verrà memorizzato nel blocco di memoria che malloc assegnerà.

ð Siccome però questa informazione è necessaria per l’aritmetica dei puntatori, occorre fare un casting al tipo di puntatore giusto.

ð Questo casting può essere implicito ð Occorre stare attenti che l’argomento della malloc sia

sempre corretto (usare l’operatore sizeof è praticamente obbligatorio)

25 novembre 2013 Lezione 26 I file e altre cose utili 31

Per deallocare la memoria…

ð Esiste la funzione void free (void *p)"

ð che dealloca la memoria precedentemente allocata da malloc (e anche da calloc e realloc)

25 novembre 2013 Lezione 26 I file e altre cose utili 32