1 Gestione dei File Corso di Informatica A Vito Perrone.

20
1 Gestione dei File Corso di Informatica A Vito Perrone

Transcript of 1 Gestione dei File Corso di Informatica A Vito Perrone.

Page 1: 1 Gestione dei File Corso di Informatica A Vito Perrone.

1

Gestione dei FileGestione dei File

Corso di Informatica A

Vito Perrone

Page 2: 1 Gestione dei File Corso di Informatica A Vito Perrone.

2Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

IndiceIndice

•Il file system in C •Principali operazioni sui file (dalla Standard Library)

•Esempi

Page 3: 1 Gestione dei File Corso di Informatica A Vito Perrone.

3Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Il file system in C

• Flusso di comunicazione:− binario (sequenza di byte)− di tipo testo (sequenza di caratteri)

• Modalità di utilizzo: − Lettura, scrittura o lettura e scrittura;

• Posizione corrente: − Punta al prossimo byte da leggere o scrivere sul

file;• Indicatore di errore;• Indicatore di end-of-file (eof).

Page 4: 1 Gestione dei File Corso di Informatica A Vito Perrone.

4Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Tabella file aperti

nomefile:modouso:poscorr:….

nomefile:modouso:poscorr:….

nomefile:modouso:poscorr:….

nomefile: FileTremodouso:poscorr:….

nomefile: FileUnomodouso:poscorr:….

nomefile: FileDuemodouso:poscorr:….

Variabili puntatore

stdin

Tabella dei file aperti

File

StandardInput

stdout

stderr

f1

f2

f3

StandardInput

StandardError

FileUno

FileDue

FileTre

Page 5: 1 Gestione dei File Corso di Informatica A Vito Perrone.

5Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Operazioni di gestione dei file

• FILE *fopen (nomefile, modalità)• int fclose (FILE *fp)• int remove (nomefile)

• int rename (vecchionome, nuovonome)• int ferror (FILE *fp)• int feof (FILE *fp)• void clearerr (FILE *fp)

Page 6: 1 Gestione dei File Corso di Informatica A Vito Perrone.

6Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Operazioni di lettura/scrittura

• int fprintf (FILE *fp, stringa di controllo, elementi) • int fscanf (FILE *fp, stringa di controllo, indirizzo

elementi)

• int getchar (void)• int putchar (int c)

• int fgetc (FILE *fp)• int fputc (int c, FILE *fp)

Page 7: 1 Gestione dei File Corso di Informatica A Vito Perrone.

7Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*Legge e mostra sul video il contenuto del file di testo filechar*/#include <stdio.h>

/* Contiene la definizione di EOF, del tipo FILEe le testate delle funzioni che operano su file */

#include <stddef.h> /* Contiene la definizione di NULL */

main(){

FILE *fp;char 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");}

Esempi con file di testo (1)

Page 8: 1 Gestione dei File Corso di Informatica A Vito Perrone.

8Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*Lettura e scrittura di stringhe (1)*/#include <stdio.h>#include <stddef.h>#include <string.h>#define OK 1#define ERROR 0#define MAXLINE 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;

}…

Esempi con file di testo (2)

Page 9: 1 Gestione dei File Corso di Informatica A Vito Perrone.

9Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*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;

}

Esempi con file di testo (3)

Page 10: 1 Gestione dei File Corso di Informatica A Vito Perrone.

10Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Lettura e scrittura di strutture

• int fread(void *ptr, dimelemento, numelementi, FILE *fp);

• int fwrite(void *ptr, dimelemento, numelementi, FILE *fp);

Page 11: 1 Gestione dei File Corso di Informatica A Vito Perrone.

11Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*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;…

Esempio con file binario (1)

Page 12: 1 Gestione dei File Corso di Informatica A Vito Perrone.

12Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

…/*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);

}}

Esempio con file binario (2)

Page 13: 1 Gestione dei File Corso di Informatica A Vito Perrone.

13Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

Accesso diretto (1)

• int fseek(FILE *fp, long offset, int 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);

Page 14: 1 Gestione dei File Corso di Informatica A Vito Perrone.

14Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*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 */

}…

Accesso diretto (2)

Page 15: 1 Gestione dei File Corso di Informatica A Vito Perrone.

15Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/*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;

} }

Accesso diretto (3)

Page 16: 1 Gestione dei File Corso di Informatica A Vito Perrone.

16Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/* 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 destradell'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 ();…

Programma Servizio Voli (1)

Page 17: 1 Gestione dei File Corso di Informatica A Vito Perrone.

17Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/* Programma ServizioVoli (2)*/…Risposta = getchar ();switch (Risposta){

case 'P': ServiPrenotazioni();break;

case 'C': ServiCancellazioni();break;

case 'A': ServiListaAttesa();break;

case 'F': Fine = true;break;

}} while (Fine == false);[RipulisciLoSchermo]puts ("\n\n\nArrivederci\n");

}

Programma Servizio Voli (2)

Page 18: 1 Gestione dei File Corso di Informatica A Vito Perrone.

18Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/* Programma ServizioVoli (3)*/

 

#define MAXPOSTI 350typedef struct { char Cognome[30];

char Nome[30];} Passeggero;

typedef struct { int NumVolo;char Data[10];Passeggero

Prenotazioni[MAXPOSTI];Passeggero ListaAttesa[100];

} DescrizioneVolo; 

Programma Servizio Voli (3)

Page 19: 1 Gestione dei File Corso di Informatica A Vito Perrone.

19Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/* Programma ServizioVoli (4)*/

boolean Fine;char Risposta;

/* Puntatore al descrittore del file ArchivioVoli */FILE *av; 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 */

Programma Servizio Voli (4)

Page 20: 1 Gestione dei File Corso di Informatica A Vito Perrone.

20Gestione File

Informatica A – V. PerroneCopyright © 2004 - The McGraw-Hill Companies, srl

/* 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 */

Programma Servizio Voli (5)