Files
Files
Gestione dei
dei file
file
Un file e’ definito come un oggetto, presente nel file system, costituito da
una sequenza continua di bytes
File
File di
di testo
testo ee binari
binari
In funzione del tipo di contenuto di un file, distinguiamo:
File di testo 48 45 4C 4C 4F 0A
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ ‘\n’
File di binario 00 04 CC 36 4E FC
2
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
1
Uso
Uso dei
dei file
file (apertura/chiusura)
(apertura/chiusura)
Apertura:
FILE * fopen (char * pathname, char * mode)
Chiusura:
int fclose (FILE * f)
3
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
Uso
Uso dei
dei file
file di
di testo
testo (lettura/scrittura)
(lettura/scrittura)
Scrittura:
int fprintf (FILE *f, char * format, ...)
Lettura:
int fscanf (FILE *f, char * format, ...)
4
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
2
Uso
Uso dei
dei file
file di
di testo,
testo, esempio
esempio
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
...
int i;
FILE * f;
f = fopen (“dati.txt”,”w”); // creazione e apertura in scrittura
if (f == NULL)
printf (“Errore di apertura\n”);
else {
for (i = 0;i < VECTOR_SIZE;i++)
fprintf (f, “%d\n”, dati [i]); // scrittura dei dati
fclose (f); // chiusura del file a conclusione
}
...
5
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
Uso
Uso dei
dei file
file di
di testo,
testo, esempio
esempio
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
...
int i;
FILE * f;
f = fopen (“dati.txt”,”r”); // apertura in lettura
if (f == NULL)
printf (“Errore di apertura\n”);
else {
for (i = 0;i < VECTOR_SIZE;i++)
fscanf (f, “%d”, & dati [i]); // lettura dei dati
fclose (f); // chiusura del file a conclusione
}
...
6
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
3
File
File di
di testo
testo
7
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
Uso
Uso dei
dei file
file di
di binari
binari (lettura/scrittura)
(lettura/scrittura)
La scrittura/lettura avviene specificando il puntatore al blocco di dati da
leggere/scrivere e la dimensione dei dati da leggere/scrivere
Scrittura:
int fwrite (void * ptr, int size, int num, FILE *f)
Lettura:
int fread (void * ptr, int size, int num, FILE *f)
8
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
4
Uso
Uso dei
dei file
file binari,
binari, esempio
esempio
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
...
int i;
FILE * f;
f = fopen (“dati.bin”,”wb”); // creazione e apertura in scrittura
// file binario
if (f == NULL)
printf (“Errore di apertura\n”);
else {
for (i = 0;i < VECTOR_SIZE;i++)
fwrite (& dati[i], sizeof (int), 1, f); // scrittura dei dati
fclose (f); // chiusura del file a conclusione
}
...
9
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
File
File binari
binari -- fwrite
fwrite
fwrite (& dati[i], sizeof (int), 1, f);
5
Uso
Uso dei
dei file
file binari,
binari, esempio
esempio
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
...
int i;
FILE * f;
f = fopen (“dati.bin”,”rb”); // apertura in lettura
// file binario
if (f == NULL)
printf (“Errore di apertura\n”);
else {
for (i = 0;i < VECTOR_SIZE;i++)
fread (& dati[i], sizeof (int), 1, f); // lettura dei dati
fclose (f); // chiusura del file a conclusione
}
...
11
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
File
File binari
binari
dati [0] = 5
dati [1] = 10
dati [2] = 4 Ogni elemento (numero intero) occupa 4 byte
dati [3] = 43
dati [4] = 7
File “dati.bin”
05 00 00 00 0A 00 00 00 04 00 00 00 2B 00 00 00
12
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
6
Gestione
Gestione dell’end-of-file
dell’end-of-file
for (i = 0;i < VECTOR_SIZE;i++) for (i = 0;i < VECTOR_SIZE;i++)
fread (& dati[i], sizeof (int), 1, f); fscanf (f, “%d”, & dati[i]);
Se questo numero non e’ noto, occorre leggere il file fino alla sua fine
Occorre dunque sapere quanto abbiamo raggiunto la fine del file.
La funzione:
int feof (FILE * f)
restituisce “1” se abbiamo raggiunto la fine del file f, “0” altrimenti
13
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
File
File binari:
binari: gestione
gestione dell’eof
dell’eof
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
int i;
FILE * f;
f = fopen (“dati.bin”,”rb”); // apertura in lettura
// file binario
if (f == NULL)
printf (“Errore di apertura\n”);
else {
i = 0;
while (!feof (f)) {
fread (& dati[i], sizeof (int), 1, f); // lettura dei dati
i++;
}
fclose (f); // chiusura del file a conclusione
}
...
14
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
7
File
File binari:
binari: gestione
gestione dell’eof
dell’eof–– Implementazione
Implementazione corretta
corretta
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
int i;
FILE * f;
f = fopen (“dati.bin”,”rb”); // apertura in lettura
// file binario
if (f == NULL)
printf (“Errore di apertura\n”);
else {
i = 0;
while (fread (& dati[i], sizeof (int), 1, f) == 1) { // lettura e
controllo
i++;
}
fclose (f); // chiusura del file a conclusione
}
...
15
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
File
File di
di testo:
testo: gestione
gestione dell’eof
dell’eof –– Implementazione
Implementazione corretta
corretta
#include <stdio.h>
...
...
#define VECTOR_SIZE 10
int dati[VECTOR_SIZE];
...
int i;
FILE * f;
f = fopen (“dati.bin”,”r”); // apertura in lettura
if (f == NULL)
printf (“Errore di apertura\n”);
else {
i = 0;
while (fscanf (f, “%d”,& dati[i]) == 1) { // lettura e
controllo
i++;
}
fclose (f); // chiusura del file a conclusione
}
...
16
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
8
Case-Study:
Case-Study: una
una rubrica
rubrica telefonica
telefonica
#include <stdio.h>
#include <string.h>
typedef struct {
char cognome [40];
char nome [40];
char telefono [30];
} t_elemento_rubrica;
...
17
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
Case-Study:
Case-Study: una
una rubrica
rubrica telefonica
telefonica
...
int main (int argc, char * argv[])
{
int choice;
do {
printf ("0- Fine\n");
printf ("1- Inserisci nominativo\n");
printf ("2- Cerca nominativo\n");
scanf ("%d", &choice);
switch (choice) {
case 1: insert_name (); break;
case 2: search_name (); break;
}
} while (choice != 0);
}
...
18
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
9
Case-Study:
Case-Study: una
una rubrica
rubrica telefonica
telefonica
...
void insert_name (void)
{
t_elemento_rubrica e;
FILE * f;
printf ("Cognome :");
scanf ("%s", e.cognome);
printf ("Nome :");
scanf ("%s", e.nome);
printf ("Telefono:");
scanf ("%s", e.telefono);
f = fopen (FILENAME, "ab"); // append = apertura in scrittura alla
// fine del file
if (f == NULL)
printf ("Errore di apertura del file.\n");
else {
fwrite (&e, sizeof (t_elemento_rubrica), 1, f);
fclose (f);
}
}
...
19
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
Case-Study:
Case-Study: una
una rubrica
rubrica telefonica
telefonica
...
void search_name (void)
{
char cognome [40];
t_elemento_rubrica e;
FILE * f;
printf ("Inserisci il cognome da cercare :");
scanf ("%s", cognome);
f = fopen (FILENAME, "rb");
if (f == NULL)
printf ("Errore di apertura del file.\n");
else {
while (fread (&e, sizeof (t_elemento_rubrica), 1, f) == 1) {
if (strcmp (e.cognome, cognome) == 0) {
printf ("Cognome : %s\n", e.cognome);
printf ("Nome : %s\n", e.nome);
printf ("Telefono : %s\n", e.telefono);
}
}
fclose (f);
}
}
20
Corrado Santoro – Laboratorio di Informatica – Lezione 10 – CdS Ing. Informatica – Universita’di Catania
10
ESERCIZIO
ESERCIZIOSULLE
SULLECODE
CODE++FILES
FILES
11