11. Gestione dei file
Ing. Simona Colucci
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Indice
• Il file system in C
• Principali operazioni sui file (dalla Standard Library)
• Esempi
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Il file system in C
• La gestione dei file in C avviene tramite un flusso di
comunicazione:
– Dichiarazione di una variabile di tipo puntatore al file(ad un oggetto
di tipo FILE), che costituirà il riferimento al file per tutto il tempo di
apertura del flusso
– Apertura del flusso tramite una funzione di libreria(fopen)
– Chiusura del flusso tramite una funzione di libreria(fclose)
• Classificazione del flusso di comunicazione:
– binario : sequenza di byte
– di tipo testo : sequenza di caratteri suddivisa in linee terminate
dal carattere di newline
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
Il tipo strutturato FILE
DEE - Politecnico di Bari
• Capace di memorizzare tutte le informazioni necessarie a
controllare un flusso
• Possibili campi:
• Modalità di utilizzo: lettura, scrittura o lettura e scrittura;
• Posizione corrente: punta al prossimo byte da leggere o scrivere
sul file;
• Indicatore di errore: registra il presentarsi di un errore di lettura
o scrittura
• Indicatore di end-of-file (eof).
• Dichiarazione di variabile:
FILE *fp
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Tabella file aperti
• Il sistema operativo gestisce una tabella dei file aperti:
FILE TabellaFileAperti[MaxNumFileGestibili]
E’ un vettore che memorizza le informazioni relative alle modalità di
utilizzo dei singoli file
• L’apertura di un flusso provoca:
– la creazione di un nuovo elemento nella tabella con tutte le
informazioni del file aperto
– La restituzione alla variabile puntatore definita nel programma C
l’indirizzo di tale tabella
• L’utente provoca la manipolazione indiretta della
struttura di tipo file tramite le funzioni di libreria stdio.h,
ma solo il sistema operativo manipola i campi
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
I flussi standard
• Automaticamente aperti quando inizia l’esecuzione di un
programma:
– stdin: associato al file che rappresenta la tastiera del terminale
– stdout: associato al file che rappresenta il video del terminale
– stderr: associato al file che rappresenta il video del terminale
• Sono le variabili puntatore ai descrittori dei file associati
con le periferiche, come visto nella macchina di Von
Neumann
• Esempio:
– printf scrive sul file puntato da stdout
– scanf legge dal file puntato da stdin
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Operazioni di gestione dei file
•
FILE
*fopen (nomefile, modalità)
modalita possibili:
- r: lettura in modalità testo, posizionamento inizio file
- w: scrittura in modalità testo, posizionamento inizio file
- a: scrittura in modalità testo, posizionamento fine file
- rb, wb, ab: r, w, a, in modalità binaria
- r+,w+,a+, rb+, wb+, ab+: lettura e scrittura su file con modalità di testo o
binaria
•
int
fclose (FILE *fp)
Pone pari a NULL il valore di fp, restituisce 0 o EOF in caso di errori
•
•
int
remove (nomefile)
int
rename (vecchionome,
nuovonome)
Restituiscono 0 in caso positivo, un valore diverso in caso contrario
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Operazioni di gestione degli errori
Nella struttura di gestione di un file aperto sono presenti:
• Un’informazione che tenga traccia della presenza di un
errore
– int
ferror (FILE
*fp)
• Un’informazione che dice se si è giunti alla fine del file:
– int
feof (FILE
*fp)
• La possibilità di ripristinare nei campi i valori di default
prima dell’errore:
– void
clearerr (FILE
*fp)
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Operazioni di lettura e scrittura
• Lettura e scrittura formattata: si precisa il formato
dei dati da manipolare
• Lettura e scrittura di caratteri: accesso per caratteri
• Lettura e scrittura di stringhe: accesso per linee
• Lettura a scrittura di strutture: acceso per blocchi
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
int
int
int
int
Lettura e scrittura formattata
printf (stringa di controllo, elementi)
scanf (stringa di controllo, indirizzo elementi)
fprintf (FILE *fp, stringa di controllo, elementi)
fscanf (FILE *fp, stringa di controllo, indirizzo elementi)
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
•
•
Lettura e scrittura per caratteri
int getchar (void)
int putchar(int c)
int getc(FILE *fp)
int fgetc (FILE *fp)
int putc (int c, FILE *fp)
int fputc (int c, FILE *fp)
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
•
•
•
•
Lettura e scrittura per stringhe
char *gets(char *s)
int fgets (char *s, int n, FILE *fp)
int puts (char *s)
int fputs (char *s, FILE *fp)
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Esempi con file di testo (1)
/*Legge e mostra sul video il contenuto del file di testo filechar*/
#include <stdio.h>
/* Contiene la definizione di EOF, del tipo FILE
e le testate delle funzioni che operano su file */
#include <stddef.h>
/* Contiene la definizione di NULL */
main()
{
FILE
char
*fp;
c;
if ((fp = fopen("filechar", "r")) != NULL)
/* Il file viene aperto in lettura con modalità testo */
{
while ((c = fgetc(fp)) != EOF)
/* Viene letto e stampato un carattere per volta sino a fine file */
putchar(c);
fclose(fp);
}
else
printf("Il file non può essere aperto\n");
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
Esempi con file di testo (2)
DEE - Politecnico di Bari
/*Lettura e scrittura di stringhe (1)*/
#include <stdio.h>
#include <stddef.h>
#include <string.h>
#define OK
#define ERROR 0
#define MAXLINE
1
100
int copiaselettiva(char refstr[])
{
char
line[MAXLINE];
FILE
*fin, *fout;
If ((fin = fopen("filein", "r")) == NULL)
/* filein viene aperto in lettura con modalità testo */
return ERROR;
if ((fout = fopen("fileout", "w")) == NULL)
/* fileout viene aperto in scrittura con modalità testo */
{
fclose(fin);
return ERROR;
}
…
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Esempi con file di testo (3)
/*Lettura e scrittura di stringhe (2)*/
…
while (fgets(line,MAXLINE,fin) != NULL)
/* fgets legge da filein al più MAXLINE–1 caratteri e assegna al
vettore line i caratteri letti, incluso l'eventuale carattere di newline,
e termina la stringa con il carattere \0 */
if (strstr (line,refstr) != NULL)
/* La funzione strstr restituisce la posizione della prima occorrenza della
stringa puntata da refstr nella stringa puntata da line; se la seconda
stringa non è contenuta nella prima viene restituito il valore NULL */
fputs(line,fout);
fclose(fin);
fclose(fout);
return OK;
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Lettura e scrittura di strutture
• int fread(void *ptr, dimelemento, numelementi, FILE *fp);
• int fwrite(void *ptr, dimelemento, numelementi, FILE *fp);
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Esempio con file binario (1)
/*Gestione file Persone (1)*/
typedef struct { char
nome[20];
char
cognome[20];
char
indirizzo[50];
} Persona;
typedef char CodFisc[16];
typedef struct { char
nome[20];
char
cognome[20];
char
indirizzo[50];
CodFisc CodiceFiscale;
} NuovaPersona;
/* I file Persone, CodiciFiscali e Nuove Persone si suppongono aperti dal main.
pp, cf e np fanno riferimento ai tre file in questione */
int AggiornaPersone (FILE *pp, FILE *cf, FILE *np)
{
Persona
PersonaCorrente;
CodFisc
CodFiscCorrente;
NuovaPersona NuovaPersonaCorrente;
…
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Esempio con file binario (2)
…
/*Gestione file Persone (2)*/
rewind(pp);
/* Rende possibile le seguenti operazioni di lettura e scrittura sul file
identificato da pp, iniziando dal primo byte del file.*/
rewind(cf);
rewind(np);
while (fread(&PersonaCorrente,sizeof(Persona),1,pp) != 0)
/* Finché non si è raggiunta la fine del file */
{
fread(&CodFiscCorrente,sizeof(CodFisc),1,cf);
strcpy(NuovaPersonaCorrente.nome, PersonaCorrente.nome);
strcpy(NuovaPersonaCorrente.cognome,PersonaCorrente.cognome);
strcpy(NuovaPersonaCorrente.indirizzo, PersonaCorrente.indirizzo);
strcpy(NuovaPersonaCorrente.CodiceFiscale, CodFiscCorrente);
fwrite(&NuovaPersonaCorrente,sizeof(NuovaPersona),1,np);
}
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Accesso diretto
Sistemi Informativi
DEE - Politecnico di Bari
Consente di accedere direttamente ai byte specificati all’interno del file tramite
le funzioni:
• int fseek(FILE *fp, long offset, int refpoint)
Refpoint:
– SEEK_SET : scostamento rispetto all’inizio del file,
– SEEK_CUR : scostamento rispetto alla posizione corrente,
– SEEK_END : scostamento rispetto alla fine del file.
•
•
long ftell(FILE *fp)
rewind(f)
equivale a:
fseek (f, 0, SEEK_SET);
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
Accesso diretto (2)
DEE - Politecnico di Bari
/*Inversione del contenuto di un file numint di interi (1)*/
...
main ()
{
FILE
*f;
long int
inizio, fine;
int
tempi, tempf;
unsigned int
dim;
if ((f = fopen ("numint", "rb+")) == NULL)
{
puts ("Non è stato possibile aprire il file numint");
/* più efficiente della printf per la stampa di un messaggio dato che non richiede la scansione e l’interpretazione
della stringa di controllo */
exit(1);
/* La funzione exit provoca una conclusione non anomala del programma e la restituzione del controllo al
sistema operativo */
}
…
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Accesso diretto (3)
/*Inversione del contenuto di un file numint di interi (2)*/
...
inizio = 0;
dim = sizeof(int);
fseek (f, –dim, SEEK_END);
/* SEEK_END è una costante definita nel file stdio.h. Ha valore 2 */
fine = ftell (f);
while (inizio < fine)
{
fseek (f, inizio, SEEK_SET);
fread (&tempi, dim, 1, f);
fseek (f, fine, SEEK_SET);
fread (&tempf, dim, 1, f);
/* È necessario riposizionarsi */
fseek (f, fine, SEEK_SET);
fwrite (&tempi, dim, 1, f);
fseek (f, inizio, SEEK_SET);
fwrite (&tempf, dim, 1, f);
inizio = inizio + dim;
fine = fine – dim;
}
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Programma Servizio Voli (1)
/* Programma ServizioVoli (1)*/
void main ()
{
[dichiarazioni varie: esse dovranno definire le variabili necessarie per far riferimento ai file che memorizzano l'archivio,
le varie funzioni destinate alla sua gestione in relazione alle operazioni richieste, le variabili e i tipi associati all'archivio
e le variabili e tipi necessari per la realizzazione del menu]
Fine = false;
do
{
[RipulisciLoSchermo]
puts ("\nSono disponibili le seguenti operazioni. Per selezionare
un'operazione premere il tasto indicato alla destra
dell'operazione e il carattere di Invio.\n");
/* Ricordiamo che puts inserisce dopo la stringa un newline ottenendo l'andata a capo */
puts ("Prenotazione volo:
P");
puts ("Cancellazione di una prenotazione:
C");
puts ("Inserimento in lista di attesa:
A");
puts ("Fine operazioni:
F");
Risposta = getchar ();
…
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Programma Servizio Voli (2)
/* Programma ServizioVoli (2)*/
…
Risposta = getchar ();
switch (Risposta)
{
case
'P':
case
'C':
case
'A':
case
'F':
ServiPrenotazioni();
break;
ServiCancellazioni();
break;
ServiListaAttesa();
break;
Fine = true;
break;
}
} while (Fine == false);
[RipulisciLoSchermo]
puts ("\n\n\nArrivederci\n");
}
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
Programma Servizio Voli (3)
DEE - Politecnico di Bari
/* Programma ServizioVoli (3)*/
#define
typedef
MAXPOSTI
struct
typedef
struct
350
{
char
Cognome[30];
char
Nome[30];
} Passeggero;
{
int
NumVolo;
char
Data[10];
Passeggero
Prenotazioni[MAXPOSTI];
Passeggero
ListaAttesa[100];
} DescrizioneVolo;
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Programma Servizio Voli (4)
/* Programma ServizioVoli (4)*/
boolean
char
Risposta;
Fine;
FILE
*av;
/* Puntatore al descrittore del file ArchivioVoli */
void
…
ServiPrenotazioni (void);
/* Esegue, se possibile, la prenotazione richiesta. In caso contrario, chiede automaticamente all'utente se desidera
essere messo in lista di attesa. Se la risposta è positiva, chiama la funzione ServiListaAttesa senza bisogno di
ritornare al menu principale. Dopo l'esecuzione della funzione ServiListaAttesa, termina anche la ServiPrenotazioni.
L'esecuzione della funzione comporta l'interazione con l'utente attraverso un opportuno menu in cui vengono chiesti
all'utente il numero e la data del volo desiderato, il cognome e il nome del passeggero. Dopo aver ottenuto i dati
richiesti la funzione accede all'archivio e provvede alle necessarie operazioni di interrogazione e aggiornamento */
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Sistemi Informativi
DEE - Politecnico di Bari
Programma Servizio Voli (5)
/* Programma ServizioVoli (5)*/
…
void
ServiCancellazioni (void);
/* Vengono chiesti, tramite opportuno menu, i dati del passeggero e l'identificazione del volo al quale
si intende rinunciare. Viene cancellato il passeggero dalla relativa lista. Inoltre, se la lista d'attesa del
volo non è vuota, si estrae il suo primo elemento e lo si inserisce nella lista delle prenotazioni. Viene
quindi scritto un messaggio sul terminale che avvisa l'operatore che un elemento della lista d'attesa
ha ora la sua prenotazione confermata */
void
ServiListaAttesa(void);
/* Vengono chieste le solite informazioni e viene inserito il passeggero nella lista d'attesa desiderata */
Fondamenti di Informatica
CDL in Ingegneria Gestionale (B)- A.A. 2010-2011
Scarica

Gestione dei file - SisInf Lab