C/Lettura e scrittura su file
Dal punto di vista del programma scritto in linguaggio C, il file viene utilizzato in qualità di flusso logico di dati (stream), ovvero flusso di file. Per la precisione, un file viene aperto attribuendogli un puntatore che rappresenta il flusso di file relativo; quando poi il flusso viene chiuso, l'associazione con il file si conclude.
La gestione del flusso di file avviene in modo trasparente, con l'ausilio di funzioni standard e una struttura dati definita nella libreria stdio si tratta del tipo 'FILE'.
L'apertura di un file, attraverso le funzioni standard, coincide con l'ottenimento di un puntatore al tipo FILE; pertanto, questo puntatore rappresenta il flusso di file e tutti i riferimenti a tale flusso si fanno con quel puntatore.
Apertura e chiusura di un file
modificaL'apertura dei file viene ottenuta normalmente con la funzione fopen() che restituisce il puntatore al file, oppure il puntatore nullo, NULL, in caso di fallimento dell'operazione. L'esempio seguente mostra l'apertura del file mio_file contenuto nella directory corrente, con una modalità di accesso in sola lettura.
#include <stdio.h>
...
int main (void)
{
FILE *fp_mio_file;
...
fp_mio_file = fopen ("mio_file", "r");
if (fp_mio_file==NULL)
// se il file non esiste il puntatore ottenuto dalla fopen assume valore NULL
else // il puntatore è diverso da NULL pertanto si può lavorare sul file, in questo caso leggere.
...
}
Come si vede dall'esempio, è normale assegnare il puntatore ottenuto a una variabile adatta, che da quel momento identifica il file, finché questo resta aperto.
La chiusura del file avviene in modo analogo, attraverso la funzione fclose(), che restituisce zero se l'operazione è stata conclusa con successo, oppure il valore rappresentato da EOF. L'esempio seguente ne mostra l'utilizzo.
...
fclose (fp_mio_file);
...
La chiusura del file conclude l'attività con questo, dopo avere scritto tutti i dati eventualmente ancora rimasti in sospeso (se il file è stato aperto in scrittura).
I prototipi delle 2 funzioni:
FILE* fopen (const char *nome, const char *modalità);
int fclose (FILE *flusso_di_file);
Il parametro nome
rappresenta il percorso del file da aprire, mentre la modalità
è una delle seguenti:
Modalità | Significato |
---|---|
r | file di testo in sola lettura. |
w | file di testo in sola scrittura. Se esiste ne è cancellato il contenuto altrimenti viene creato |
r+ | file di testo in lettura e scrittura. |
w+ | Se il file non esiste, lo crea e lo apre in lettura e scrittura. Se esiste, lo cancella e lo apre in lettura e scrittura. |
a | Apre il file in sola scrittura, facendo in modo che si possa solo aggiungervi del contenuto, alla fine. Se il file non esiste, viene creato. |
a+ | Come a , solo che è abilitata anche la lettura.
|
b | se una b viene aggiunta alle modalità precedenti si indica che il file è binario. Ossia:
rb, wb, ab, e r+b, w+b, a+b equivalenti a rb+, wb+, ab+ |
Flussi standard
modificaCi sono tre flussi di file che risultano aperti in modo predefinito, all'avvio del programma:
- standard input, corrispondente normalmente alla tastiera;
- standard output, corrispondente normalmente allo schermo del terminale;
- standard error, anch'esso corrispondente normalmente allo schermo del terminale.
Spesso si utilizzano questi flussi di file attraverso funzioni apposite che vi fanno riferimento in modo implicito, ma si potrebbe accedere anche attraverso funzioni generalizzate, utilizzando come puntatori i nomi: stdin
, stdout
e stderr
.
Tipologie di file