File in C
stream - flussi in C la gestine dei file avviene attravers un fluss di cmunicazine per utilizzare un file è necessari dichiarare una variabile di tip puntatre al file (ad un ggett di tip FILE) la funzine fpen permette di aprire un file per pter perare cn ess la funzine fclse chiude il fluss e termina le perazini su quest.
tipi di flussi in C trviam due tipi di flussi di cmunicazine: binari : sequenze di byte di test : sequenze di caratteri suddivise in linee terminate dal carattere di newline
il tip FILE all intern di un FILE trviam tutte le infrmazini necessarie per la sua gestine: mdalità di utilizz: lettura, scrittura lettura e scrittura psizine crrente: punta al prssim byte da leggere scrivere sul file; indicatre di errre indicatre di end-f-file (ef)
dichiarazine FILE *<nme del file>; esempi: FILE *fp; i flussi standard (tastiera e vide) sn autmaticamente aperti all inizi dell esecuzine di un prgramma stdin (standard input) è assciat alla tastiera stdut (standard utput) è assciat al vide stderr (standard errr) è assciat al vide es. printf scrive su stdut e scanf legge da stdin
apertura di un file FILE *fpen (nmefile, mdalità) restituisce il puntatre a un file aprend il fluss secnd la mdalità specificata mdalità pssibili: r: lettura in mdalità test, psizinament inizi file w: scrittura in mdalità test, psizinament inizi file a: scrittura in mdalità test, psizinament fine file rb, wb, ab: r, w, a, in mdalità binaria r+, w+, a+, rb+, wb+, ab+: lettura e scrittura su file cn mdalità di test binaria
chiusura intfclse (FILE *fp) pne a NULL il valre di fp, restituisce 0 EOF in cas di errri
perazini sui file int remve(nmefile) elimina un file (0 se eliminat cn success) int rename(vecchinme,nuvnme) rinmina un file (0 perazine terminata cn success) int fef(file *fp) 1 (true) se si è raggiunta la fine del file
perazini di lettura e scrittura tipi di lettura e scrittura lettura e scrittura frmattata: si definisce il frmat dei dati da maniplare lettura e scrittura di caratteri: access per caratteri lettura e scrittura di stringhe: access per linee lettura e scrittura di strutture: acces per blcchi
lettura e scrittura frmattata int printf (stringa di cntrll, elementi) int scanf (stringa di cntrll, indirizz elementi) int fprintf (FILE *fp, stringadicntrll, elementi) int fscanf (FILE *fp, stringadicntrll, indirizz elementi)
lettura e scrittura per caratteri int getchar (vid) int putchar(int c) int getc(file *fp) int fgetc (FILE *fp) int putc (int c, FILE *fp) int fputc (int c, FILE *fp)
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)
esempi cn file di test (1) /*Legge e mstra sul vide il cntenut del file di test filechar*/ #include <stdi.h> /* Cntiene la definizine di EOF, del tip FILE e le testate delle funzini che peran su file */ #include <stddef.h> /* Cntiene la definizine di NULL */ main() { FILE *fp; char c; } if ((fp = fpen("filechar", "r"))!= NULL) /* Il file viene apert in lettura cn mdalità test */ { while ((c = fgetc(fp))!= EOF) /* Viene lett e stampat un carattere per vlta sin a fine file */ putchar(c); fclse(fp); } else printf("il file nn può essere apert\n");
esempi cn file di test (2) /*Lettura e scrittura di stringhe (1)*/ #include <stdi.h> #include <stddef.h> #include <string.h> #define OK 1 #define ERROR 0 #define MAXLINE 100 int cpiaselettiva(char refstr[]) { char line[maxline]; FILE *fin, *fut; if ((fin = fpen("filein", "r")) == NULL) /* filein viene apert in lettura cn mdalità test */ return ERROR; if ((fut = fpen("fileut", "w")) == NULL) /* fileut viene apert in scrittura cn mdalità test */ { fclse(fin); return ERROR; }
esempi cn file di test (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 vettre line i caratteri letti, inclus l'eventuale carattere di newline, e termina la stringa cn il carattere \0 */ if (strstr (line,refstr)!= NULL) /* La funzine strstr restituisce la psizine della prima ccrrenza della stringa puntata da refstr nella stringa puntata da line; se la secnda stringa nn è cntenuta nella prima viene restituit il valre NULL */ fputs(line,fut); fclse(fin); fclse(fut); return OK; }
lettura e scrittura di strutture int fread(vid *ptr, dimelem, numelem, FILE *fp); int fwrite(vid *ptr, dimelem, numelem, FILE *fp);
esempi cn file binari (1) /*Gestine file Persne (1)*/ typedef struct { char nme[20]; char cgnme[20]; char indirizz[50]; } Persna; typedef char CdFisc[16]; typedef struct { char nme[20]; char cgnme[20]; char indirizz[50]; CdFisc CdiceFiscale; } NuvaPersna; /* I file Persne, CdiciFiscali e Nuve Persne si suppngn aperti dal main. pp, cf e np fann riferiment ai tre file in questine */ int AggirnaPersne (FILE *pp, FILE *cf, FILE *np) { Persna PersnaCrrente; CdFisc CdFiscCrrente; NuvaPersna NuvaPersnaCrrente;
esempi cn file binari (2) /*Gestine file Persne (2)*/ rewind(pp); /* Rende pssibile le seguenti perazini di lettura e scrittura sul file identificat da pp, iniziand dal prim byte del file.*/ rewind(cf); rewind(np); while (fread(&persnacrrente,sizef(persna),1,pp)!= 0) /* Finché nn si è raggiunta la fine del file */ { fread(&cdfisccrrente,sizef(cdfisc),1,cf); strcpy(nuvapersnacrrente.nme, PersnaCrrente.nme); strcpy(nuvapersnacrrente.cgnme,persnacrrente.cgnme); strcpy(nuvapersnacrrente.indirizz, PersnaCrrente.indirizz); strcpy(nuvapersnacrrente.cdicefiscale, CdFiscCrrente); fwrite(&nuvapersnacrrente,sizef(nuvapersna),1,np); } }
access dirett cnsente di accedere direttamente ai byte specificati all intern del file tramite le funzini: int fseek(file *fp, lng ffset, int refpint) refpint: SEEK_SET : scstament rispett all inizi del file, SEEK_CUR : scstament rispett alla psizine crrente, SEEK_END : scstament rispett alla fine del file. lng ftell(file *fp) rewind(f) equivale a: fseek (f, 0, SEEK_SET);
access dirett (2) /*Inversine del cntenut di un file numint di interi (1)*/... main () { FILE *f; lng int inizi, fine; int tempi, tempf; unsigned int dim; if ((f = fpen ("numint", "rb+")) == NULL) { puts ("Nn è stat pssibile aprire il file numint"); /* più efficiente della printf per la stampa di un messaggi dat che nn richiede la scansine e l interpretazine della stringa di cntrll */ exit(1); /* La funzine exit prvca una cnclusine nn anmala del prgramma e la restituzine del cntrll al sistema perativ */ }
access dirett (3) /*Inversine del cntenut di un file numint di interi (2)*/... inizi = 0; dim = sizef(int); fseek (f, dim, SEEK_END); /* SEEK_END è una cstante definita nel file stdi.h. Ha valre 2 */ fine = ftell (f); while (inizi < fine) { fseek (f, inizi, SEEK_SET); fread (&tempi, dim, 1, f); fseek (f, fine, SEEK_SET); fread (&tempf, dim, 1, f); /* È necessari ripsizinarsi */ fseek (f, fine, SEEK_SET); fwrite (&tempi, dim, 1, f); fseek (f, inizi, SEEK_SET); fwrite (&tempf, dim, 1, f); inizi = inizi + dim; fine = fine dim; } }