Il 0% ha trovato utile questo documento (0 voti)
11 visualizzazioni6 pagine

15 Filec

Il documento descrive i file e le loro caratteristiche principali. Vengono distinti i file di testo da quelli binari e spiegate le loro differenze. Vengono inoltre forniti esempi di file di testo.

Caricato da

MaxMax
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
11 visualizzazioni6 pagine

15 Filec

Il documento descrive i file e le loro caratteristiche principali. Vengono distinti i file di testo da quelli binari e spiegate le loro differenze. Vengono inoltre forniti esempi di file di testo.

Caricato da

MaxMax
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Sei sulla pagina 1/ 6

mylib.h contribuenti.

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

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

File di testo Esempi di file di testo


Sono file di caratteri, organizzati in linee. • File sorgenti di • File che contengono dei
programmi C dati in formato
Ogni linea è terminata da una marca di fine “leggibile”
linea (newline, carattere '\n').
contribuenti.txt
ÎIl record logico può essere il singolo mylib.h
Paolucci,Enrico, 24000,23.0
carattere, la parola, oppure la linea. #include <stdio.h>
#define N 25
Pasquini,Laura,21000,21.0
Pierantoni,Marco,37000,25.0
Poli,Valerio,15000,19.0
Egregio Sig. Rossi, int leggi(int*, int);
Ramponi,Stefano,800,0.0
con la presente void scambia(int*, int*);
Regoli,Fabio,1000,0.0
le rendo noto di aver provveduto void ordina(int*, int);
Ricci,Adriana,56000,39.0
... void stampa(int*, int);
Ricciardi,Daniele,22000,23.0

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Gestione di file in C Gestione di file in C


I file hanno una struttura sequenziale Apertura di un file:
I record logici sono organizzati in una sequenza; per accedere ad un Prima di accedere ad un file è necessario
particolare record logico, è necessario “scorrere” tutti quelli che lo aprirlo: l’operazione di apertura compie le
precedono: azioni preliminari necessarie affinché si
possa accedere al file possa (“in lettura” o “in
scrittura”). L’operazione di apertura inizializza
X il puntatore al file.

Per accedere ad un file da un programma C, è necessario predisporre una Accesso ad un file:


variabile che lo rappresenti (puntatore a file) Una volta aperto il file, è possibile
Puntatore a file: leggere/scrivere il file, tramite il puntatore a
è una variabile che viene utilizzata per riferire un file nelle operazioni di file.
accesso (lettura e scrittura.). Implicitamente essa indica:
• il file Chiusura di un file:
• l'elemento corrente all'interno della sequenza Alla fine di una sessione di accesso (lettura o
Ad esempio: scrittura) ad un file è necessario chiudere il
FILE *fp; file per memorizzare permanentemente il suo
contenuto in memoria di massa
Îil tipo FILE è un tipo non primitivo dichiarato nel file stdio.h.

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

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)

Se eseguita con successo, l’operazione di apertura ritorna come risultato


un puntatore al file aperto (FILE *):
Se l’apertura fallisce, fopen restituisce il valore NULL. fp
Tipici motivi di fallimento:
• Il file non esiste
• Il file viene aperto in una modalità incompatibile con le sue proprietà
(ad esempio: apro in scrittura un file a sola lettura, read only), etc.
Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Apertura in scrittura ("w") Apertura in append ("a")


FILE *fp; FILE *fp;
fp = fopen("contribuenti.txt", "w"); fp = fopen("contribuenti.txt", "a");

Anche se il file non è vuoto: EOF


contribuenti.txt
EOF (dopo l’apertura)

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

Esempio Chiusura di un File


Al termine di una sessione di accesso al file, esso deve
FILE *fp; essere chiuso.
fp=fopen("c:\temp\contribuenti.txt", "r"); L’operazione di chiusura si realizza con la funzione
<uso del file>
int fclose (FILE *fp);
fp rappresenta, dall’apertura in poi, il riferimento da
utilizzare nelle operazioni di accesso al file (lettura) dove fp rappresenta il puntatore al file da chiudere.
contribuenti.txt posto nel direttorio c:\temp\.
fp individua due cose: fclose ritorna come risultato un intero:
– il file stesso • se l’operazione di chiusura è eseguita correttamente
– l’elemento corrente all’interno del file restituisce il valore 0
• se la chiusura non è andata a buon fine, ritorna la
costante EOF.
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).

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

se fine file Lettura e Scrittura di file


• Durante la fase di accesso ad un file è Una volta aperto un file, su di esso si può accedere in
possibile verificare la presenza della marca di lettura e/o scrittura, compatibilmente con quanto
fine file con la funzione di libreria: specificato in fase di apertura.

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.

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Accesso a file di testo:


Lettura con formato
Esempio
Esistono funzioni simili a scanf e printf, ma con un parametro main() {
aggiuntivo rappresentante il puntatore al file di testo sul quale si
vuole leggere o scrivere FILE *fp;
int A; char B; float C;
Lettura con formato: fp = fopen( "dati.txt", "r" );
Si usa la funzione fscanf:
fscanf( fp, "%d%c%f", &A, &B, &C );
int fscanf (FILE *fp, str-ctrl, ind-el); ...
fclose( fp );
dove: }
• fp è il puntatore al file
• str-ctrl indica il formato dei dati da leggere
• ind-el è la lista degli indirizzi delle variabili a cui assegnare i fscanf restituisce il numero di elementi letti, oppure
valori letti. un valore negativo in caso di errore.

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

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.

Restituisce il numero di elementi scritti, oppure un


valore negativo in caso di errore.

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Esempio Lettura/scrittura di stringhe


Visualizzazione del contenuto di un file di testo: char *fgets (char *s, int n, FILE *fp);

Trasferisce nella stringa s i caratteri letti dal file puntato da fp,


#include <stdio.h> fino a quando ha letto n-1 caratteri, oppure ha incontrato un
main() { newline, oppure la fine del file.
La fgets mantiene il newline nella stringa s. Restituisce:
char c;
– la stringa letta in caso di corretta terminazione;
FILE *fp; – NULL in caso di errore o fine del file.

fp=fopen( "testo.txt", "r" ); int *fputs (char *s, FILE *fp);


while ( fscanf( fp, "%c", &c )>0 )
Trasferisce la stringa s (terminata da '\0') nel file puntato da
printf( "%c", c ); fp. Non copia il carattere terminatore '\0' né aggiunge un
fclose( fp ); newline finale.
} Restituisce:
– l’ultimo carattere scritto in caso di terminazione corretta;
– EOF altrimenti.
Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Accesso a file binari Lettura/scrittura di blocchi


Lettura
• Si può leggere o scrivere da un file
binario un intero blocco di dati (binari). int fread(void *vet, int size, int n, FILE *fp);

• 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).

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

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);
}

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Esempio: lettura e stampa il contenuto Esempio: dato il nome di un file,


di un file binario scrivere nel file un vettore di interi
#include<stdio.h> #include <stdio.h>
typedef struct{ main()
char nome[20], cognome[20]; {FILE *file;
int reddito; }persona; char nome[30];
int i,n,tab[12]={3, 6, -12, 5, -76, 3,
main() 32, 12, 65, 1, 0, -9};
{ FILE *fp; gets(nome);
persona p; if ( (file=fopen(nome,"wb"))==NULL ) {
fp=fopen("archivio.dat","rb"); printf("Impossibile aprire file d'uscita\n");
while( fread(&p, sizeof(persona),1, fp)>0 ) return 1;
printf("%s%s%d", p.nome, p.cognome, }
p.reddito); fwrite(tab, sizeof(tab[0]), 12, file);
fclose(fp); fclose(file);
} exit(0);
}

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Esempio: copiare il contenuto di un file Esempio: scrivere il contenuto di un


binario di interi (≤40) in un vettore vettore di record in un file binario
#include <stdio.h> #include <stdio.h>
#define MAX 40 #include <ctype.h>
main() #define DIM 5
{FILE *file;
char nome[30]; int crea_vettore(Persona V[], int dim);
int i, n, tab[MAX];
gets(nome); typedef struct {
if ( (file=fopen(nome, "rb"))==NULL ) { char nome[15], cognome[15], via[10];
printf("Impossibile aprire file d'ingresso\n"); int eta; } Persona;
return 1; Persona P[DIM];
}
n=fread(tab, sizeof(tab[0]),
lettura da file MAX, file); int crea_vettore(Persona P[], int dim) {
fclose(file); chiusura del file
int i=0, n=0; char s[80];
for(i=0;i<n;i++)
visualizza contenuto del vettore while (!feof(stdin) && i<dim) {
printf("%d%c", tab[i], (i==n-1) ? '\n' : '\t'); scanf("%s%s%s%d",P[i].nome,P[i].cognome,
return 0; P[i].via,&(P[i].eta));
} i++; n++; }
}
Fondamenti di Informatica L-A Fondamenti di Informatica L-A

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.

gets(nome); int fseek (FILE *f, long offset, int origin)


n=crea_vettore(P,DIM);
if ( (file=fopen(nome, "wb"))==NULL ) { si sposta di offset byte a partire dalla posizione origin (i
printf("Impossibile aprire file\n"); valori significativi di origin sono: 0, 1 o 2).
return 1; Restituisce:
} • 0 se ha spostato la posizione sul file
fwrite(P,sizeof(Persona),n,file);
• un valore diverso da 0, altrimenti.
fclose(file);
}
Origine dello spostamento:
SEEK_SET 0 inizio file
SEEK_CUR 1 posizione attuale nel file
SEEK_END 2 fine file

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Posizionamento all'inizio di un file Posizione corrente nel file


Per posizionarsi all’inizio di un file già aperto è possibile utilizzare
anche la funzione rewind: La funzione ftell restituisce la posizione del
byte sul quale si è posizionati nel file al
void rewind (FILE *f);
momento della chiamata della funzione:

file=fopen(argv[1], "r");
<lettura di vari record logici>; long ftell (FILE *f);
rewind(file);

equivale a: ftell restituisce -1 in caso di errore.


fseek(f,0,SEEK_SET); Il valore restituito da ftell può essere
utilizzato in una chiamata ad fseek.

Fondamenti di Informatica L-A Fondamenti di Informatica L-A

Potrebbero piacerti anche