Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoRenzo Ippolito Modificato 8 anni fa
1
11. Gestione dei file Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
2
Indice Il file system in C Principali operazioni sui file (dalla Standard Library) Esempi Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
3
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 Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
4
Il tipo strutturato FILE 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 Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
5
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 Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
6
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 Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
7
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 intfclose (FILE *fp) Pone pari a NULL il valore di fp, restituisce 0 o EOF in caso di errori intremove ( nomefile ) intrename (vecchionome,nuovonome) Restituiscono 0 in caso positivo, un valore diverso in caso contrario Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
8
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 –intferror (FILE*fp) Un’informazione che dice se si è giunti alla fine del file: –intfeof (FILE*fp) La possibilità di ripristinare nei campi i valori di default prima dell’errore: –voidclearerr (FILE*fp) Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
9
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 Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
10
Lettura e scrittura formattata int printf (stringa di controllo, elementi) int scanf (stringa di controllo, indirizzo elementi) int fprintf (FILE *fp, stringa di controllo, elementi) int fscanf (FILE *fp, stringa di controllo, indirizzo elementi) Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
11
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) Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
12
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) Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
13
/*Legge e mostra sul video il contenuto del file di testo filechar*/ #include /* Contiene la definizione di EOF, del tipo FILE e le testate delle funzioni che operano su file */ #include /* Contiene la definizione di NULL */ main() { FILE*fp; charc; 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)
14
Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013 /*Lettura e scrittura di stringhe (1)*/ #include #defineOK1 #defineERROR0 #defineMAXLINE100 int copiaselettiva(char refstr[]) { charline[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)
15
Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013 /*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)
16
Lettura e scrittura di strutture Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013 int fread(void *ptr, dimelemento, numelementi, FILE *fp); int fwrite(void *ptr, dimelemento, numelementi, FILE *fp);
17
Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013 /*Gestione file Persone (1)*/ typedefstruct{charnome[20]; charcognome[20]; charindirizzo[50]; } Persona; typedefcharCodFisc[16]; typedefstruct{charnome[20]; charcognome[20]; charindirizzo[50]; CodFiscCodiceFiscale; } NuovaPersona; /* I file Persone, CodiciFiscali e Nuove Persone si suppongono aperti dal main. pp, cf e np fanno riferimento ai tre file in questione */ intAggiornaPersone (FILE *pp, FILE *cf, FILE *np) { PersonaPersonaCorrente; CodFiscCodFiscCorrente; NuovaPersonaNuovaPersonaCorrente; … Esempio con file binario (1)
18
Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013 … /*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)
19
Accesso diretto 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); Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
20
Accesso diretto (2) /*Inversione del contenuto di un file numint di interi (1)*/... main () { FILE*f; long int inizio, fine; inttempi, tempf; unsigned intdim; 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 */ } … Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
21
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; } Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
22
Esercizi 1. Un laboratorio di ricerca deve gestire automaticamente il proprio personale. Le informazioni necessarie vanno memorizzate sul file "Personale.dat” e sono il nome, il cognome(supposto non ripetibile), la data di nascita e la materia di interesse di ciascun ricercatore. Si progetti tramite flow chart strutturato di un programma che consenta la scelta tra le seguenti opzioni: - Inserimento di un nuovo ricercatore nel file - Modifica della materia di interesse di un dato ricercatore - Calcolo del numero di ricercatori che condividono una materia di interesse - Ricerca ricorsiva del cognome di un ricercatore all'interno del contenuto del file Si scriva il programma che codifica in linguaggio C il progetto Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
23
Esercizi 2Una piccola azienda di servizi deve gestire le informazioni relative ai propri clienti, che sono a loro volta aziende caratterizzate da partita IVA, ragione sociale (nome azienda), Codice Fiscale del rappresentante legale, numero di dipendenti. Si progetti tramite flow-chart strutturato un programma che offra all'azienda le seguenti funzionalità: - Inserimento di un nuovo cliente nel file "clienti.dat” - Ordinamento dei clienti in base alla ragione sociale - Ricerca del rappresentante legale di una data azienda, di cui viene passata la partita IVA - Modifica del numero di dipendenti di un'azienda data, di cui viene passata la partita IVA Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
24
Esercizi 3. Una compagnia per il trasporto su strada deve gestire le informazioni relative alla propria flotta di autobus. Ogni autobus è caratterizzato da una targa, un numero di posti a sedere, una capienza massima (che include anche i posti in piedi), l'eventuale presenza anche contemporanea dei seguenti optionals: tv, servizi igienici e frigorifero. Si progetti tramite flow-chart strutturato un programma che: - Consenta l'inserimento di un nuovo autobus nel file "flotta.dat" - Consenta di modificare, data una targa, le informazioni relative ai tre tipi di optionals quando uno di essi viene aggiunto - Consenta di visualizzare, dato un numero di passeggeri che si vuole ospitare e degli optional desiderati, i numeri di targa relativi agli autobus che soddisfano i requisiti(numero di posti a sedere maggiore dei passeggeri da ospitare e optional desiderati inclusi) Si scriva il programma che codifica in linguaggio C il progetto Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
25
Esercizi 4. Un commercialista deve gestire il proprio archivio di clienti, contenuto in un file ("clienti.dat"). Ogni cliente è dotato di un nome, un codice fiscale, un tipo(che indica se si tratta di persona fisica o giuridica), un compenso mensile che versa al commercialista per la gestione della propria contabilità. Si progetti tramite flow chart strutturato un programma che consenta la scelta tra le seguenti opzioni: -Inserimento di un nuovo cliente nel file - Calcolo del compenso totale ricevuto dalle persone fisiche -Calcolo del compenso totale ricevuto dalle persone giuridiche -Modifica del compenso percepito da un cliente, individuato dal codice fiscale -Visualizzazione dei dati del cliente che fornisce al commercialista il compenso più alto Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
26
Esercizi 5. Un'azienda di traslochi ha necessità di gestire le informazioni relative ai traslochi effettuati. Ogni trasloco è caratterizzato da un nome del cliente, un cognome, una data, un indirizzo di origine, un indirizzo di destinazione, l'eventuale necessità di una scala automatica, il costo. Tutti i traslochi sono memorizzati nel file "traslochi.dat", che si suppone già caricato. Si progetti tramite flow chart strutturato un programma che consenta la scelta tra le seguenti opzioni: - Calcolo della percentuale di traslochi effettuati con scala automatica - Ordinamento dei traslochi per costo crescente PER OGNI OPZIONE E' OBBLIGATORIO l'USO DI SOTTOPROGRAMMI Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
27
Esercizi 6. Una società che organizza eventi per bambini necessita di un programma per gestire le informazioni relative a tali eventi. Ogni evento è caratterizzato da un tipo (che può essere Battesimo, Prima Comunione, Compleanno, Cresima), una data, un luogo, un'ora, il codice fiscale di un genitore e il costo. Si progetti tramite flow-chart strutturato un programma che consenta la scelta tra le seguenti opzioni: -Inserimento di un nuovo evento in un file, Eventi.dat, secondo le seguenti condizioni: oL'inserimento deve avvenire solo se non esiste già nel file un evento che ha la stessa data, ora e luogo; oNel caso in cui esista già nel file un evento che ha la stessa data, ora e luogo, il programma deve dare all'utente la possibilità di fornire dei nuovi valori per data, ora e luogo e poi procedere con l'inserimento; -Calcolo del costo medio dell'evento, dato il tipo come parametro dall'utente. Informatica - CDL in Ingegneria Industriale- A.A. 2012-2013
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.