15 Filec
15 Filec
txt
#include <stdio.h>
#define N 25
Paolucci,Enrico, 24000,23.0
Pasquini,Laura,21000,21.0
Pierantoni,Marco,37000,25.0
I File
int leggi(int*, int); Poli,Valerio,15000,19.0
void scambia(int*, int*); Ramponi,Stefano,800,0.0
void ordina(int*, int); Regoli,Fabio,1000,0.0
void stampa(int*, int); Ricci,Adriana,56000,39.0 Il file è l’unità logica di memorizzazione dei dati su memoria di
Ricciardi,Daniele,22000,23.0 massa.
Consente una memorizzazione persistente dei dati, non limitata
mylib.obj dalle dimensioni della memoria centrale.
mylib.c
#include “mylib.h”
dd327h23d3832D323974DN29
D$(*w$w(M(8W$FDF(FK$98W$
Ogni programma vede il file come una sequenza di componenti
File
Fk$W$$Fjw948798$w4f4wf8$
WFfW$8*84W$WQ#$)$ q3qqw8
(record logici), terminata da una “marca” di fine file (End Of File,
int leggi(int a[], int dim) {
int i=0;
c(#$$Q#((8$#Q$C$$)CC8439
7jdsadkj#Q#(8j##Q8jq3od(
EOF)
while( scanf("%d", a+i) ) {
i++;
Q*4k!``978ED-A{]Apdc(*08
4$%&\DCA\CASO8
I file sono gestiti dal Sistema Operativo. L'accesso ai file da parte di
if( i>=dim ) break; programmi C può avvenire grazie a funzioni standard definite
} nella libreria di I/O (<stdio.h>) che tengono conto delle
return i;
} funzionalità del S.O ospite.
fornitori.dat ese1.exe
void scambia(int *a, int *b) {
int t;
t = *a; *a = *b; *b = t; Fontana Maria Le#Qdd3 0 a4
*84W$WQ#$)$ q3qqw8 (#$ $
Q#((8$ #Q$C$ $)CC 84397j
In C i file vengono distinti in due categorie:
} Pasquini
Martini
Laura !8e*e
Enrico ,37%%
1
1
af
bf
dsadkj#Qdd327h23d3832D32
3974DN29D$(*w$w(M(8W$FDF
• file di testo, trattati come sequenze di caratteri. organizzati in
Poli Valerio *FC9s 0 b0
(FK$98W$Fk$W$$#(8j##Q8jq
3od(Q*4k!``978EDA{]Apdc(
linee (ciascuna terminata da '\n')
Lombardo Esteban 88(Dd 1 13
Cervellini Chiara 0,9s& 1 3r
Fjw948798$w4f4wf8$WFfW$8
• file binari, visti come sequenze di bit
Cellai Alessio &&8s0 0 c4
1
Apertura di un File Apertura in lettura ("r")
FILE *fopen( char *name, char *mode );
FILE *fp;
dove: fp = fopen("contribuenti.txt", "r");
• name è un vettore di caratteri che rappresenta il nome (assoluto o
relativo) del file nel file system;
• mode esprime la modalità di accesso scelta.
– "r", in lettura (read) Se il file non è vuoto:
– "w", in scrittura (write)
– "a", scrittura, aggiunta in fondo (append)
contribuenti.txt EOF
– "b", a fianco ad una delle precedenti, indica che il file è binario (se
non specificato, il file è di testo)
fp
fp
Il puntatore al file si posiziona sull’elemento successivo
all’ultimo elemento significativo del file. Se il file esisteva già, il
Se il file esisteva già, il suo contenuto viene perso: si suo contenuto non viene perso.
scriveranno i nuovi record logici, sopra i pre-esistenti,
a partire dal primo.
Fondamenti di Informatica L-A Fondamenti di Informatica L-A
2
Esempio File standard di I/O
#include <stdio.h> Esistono tre file testo che sono aperti automaticamente
all’inizio di ogni esecuzione:
main()
{ • stdin, standard input (tastiera), aperto in lettura
FILE *fp; • stdout, standard output (video), aperto in scrittura
fp = fopen("prova.doc", "w") • stderr, standard error (video), aperto in scrittura
<scrittura di prova.doc>
fclose(fp); Î stdin, stdout, stderr sono variabili di tipo puntatore a
file
return 0; Î esse sono automaticamente (ed implicitamente)
} definite (non vanno (ri-)definite).
int feof(FILE *fp); Per file di testo sono disponibili funzioni di:
• Lettura/scrittura con formato
• feof(fp) controlla se è stata raggiunta la • Lettura/scrittura di caratteri
fine del file fp nella operazione di lettura o • Lettura/scrittura di stringhe di caratteri
scrittura precedente:
– Restituisce il valore 0 se non è stata raggiunta la Per file binari si utilizzano funzioni di:
fine del file, • Lettura/scrittura di blocchi: fread, fwrite
– altrimenti restituisce un valore diverso da zero.
3
Scrittura con formato Esempio
Si usa la funzione fprintf: FILE *fp;
float C=0.27;
int fprintf ( FILE *fp, str-ctrl, elem ); fp=fopen( "risultati.txt", "w" );
fprintf( fp, "Risultato: %f", c*3.14 );
dove: ...
• fp è il puntatore al file
fclose( fp );
• str-ctrl indica il formato dei dati da scrivere
• elem è la lista dei valori (espressioni) da scrivere.
• Un file binario memorizza dati di Legge (al più) n oggetti di dimensione size dal file puntato da fp, e
li colloca nel vettore vet. Restituisce un intero che rappresenta il
qualunque tipo, in particolare dati che numero di oggetti effettivamente letti.
non sono necessariamente caratteri
(interi, reali, vettori o strutture). Scrittura
• Per la lettura/scrittura a blocchi è int fwrite(void *vet, int size, int n, FILE *fp);
necessario che il file sia stato aperto in Copia dal vettore vet n oggetti di dimensione size e li scrive sul file
modo binario (modo “b”). puntato da fp. Restituisce un intero che rappresenta il numero di
oggetti effettivamente scritti (inferiore ad n solo in caso di errore,
o fine del file).
4
Esempio: scrittura di una sequenza di
Lettura/scrittura di blocchi record (dati da input) in un file binario
n = fread( v, sizeof(fornitori), 4, f ); #include <stdio.h>
typedef struct{
m = fwrite( w+3, sizeof(fornitori), 2, f ); char nome[20], cognome[20];
w v int reddito; }persona;
main()
f { FILE *fp;
fornitori.dat persona p;
int fine=0;
Fontana Maria Le#Qdd3 0 a4
fp=fopen("archivio.dat","wb");
Pasquini Laura !8e*e 1 af
do {
printf("Dati persona?");
Poli Valerio *FC9s 0 b0
Lombardo Lombardo Esteban 88(Dd 1 13
scanf("%s%s%d%d",&p.nome,&p.cognome,&p.reddito);
Torroni Paolo *{90- 0 0c
Esteban
Cervellini
Kiziltan Chiara
Zeynep 0,9s&
__-?@ 1
0 3r
0e
fwrite(&p,sizeof(persona),1,fp);
88(Dd 1 13
Cellai Alessio &&8s0 0 c4 printf("Fine (si=1,no=0)?");
Cervellini
Chiara
scanf("%d", &fine);
0,9s& 1 3r } while(!fine);
fclose(fp);
}
5
Esempio: scrivere il contenuto di un File ad accesso diretto
vettore di record in un file binario Il C consente di gestire i file non solo come sequenziali, ma anche
come file ad accesso diretto.
main() {
int i, n; Posizionamento in un file:
FILE *file; La funzione fseek della Standard Library consente il
char nome[30]; posizionamento del puntatore al file su un qualunque byte.
file=fopen(argv[1], "r");
<lettura di vari record logici>; long ftell (FILE *f);
rewind(file);