Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito...
Transcript of Programmazione Avanzata Java e C Lezione 26 I file e altre cose … ex Uni/Sito...
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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