Gestione dei file

Gestione dei file


Quando si parla di lettura e scrittura di file, in realtà si fa riferimento a dei flussi. Esistono due tipi di flusso, quelli di testo e quelli binari.

I flussi di testo riguardano file contenenti un massimo di 255 caratteri per riga. Le righe non terminano con il carattere \0, caratteristico della chiusura delle stringhe, ma con il carattere di fine riga (eol) utilizzato dal sistema su cui si lavora.

Nei flussi binari il carattere di fine riga non è tradotto (o interpretato) e quindi vengono sempre elaborati così come sono.

Per accedere ad un file è necessario avviare un flusso ad esso collegato. A flusso aperto sarà possibile accedere al file in lettura oppure in scrittura o in entrambe le modalità.

La funzione che consente di accedere ai file è fopen() contenuta nella libreria stdio.h. La funzione restituisce un puntatore a file che deve essere utilizzato in ogni successiva operazione di accesso al file. Qualora l'apertura del flusso non riuscisse la funzione restituisce il valore NULL. Un possibile esempio della funzione fopen() è il seguente:

flusso = fopen("miofile.txt","r");
il primo parametro specificato "miofile.txt" è il nome del file (eventualmente comprensivo del percorso completo). In questo caso è specificato esplicitamente ma può ovviamente essere utilizzata una variabile di tipo array di char. Il secondo parametro "r" è il modo in cui si vuole aprirlo, conforme al seguente schema:
"r" - apertura per lettura;
"w" - apertura per scrittura;
"a" - apertura per scrittura in fondo al file (append);
"r+" o "w+" - apertura per lettura e scrittura;
"a+" - apertura per lettura o scrittura in fondo al file (append);

La variabile flusso, essendo un puntatore a file, deve essere così dichiarata:

FILE* flusso;
Una volta completate le operazioni sul file è necessario chiuderlo con la funzione fclose() (sempre della libreria stdio.h) in questo modo:
fclose(flusso);
La struttura del nostro programma che gestisce flussi di dati dai file è quindi simile alla seguente:
#include 
#include 

int main()
{	/* dichiarazione della variabile puntatore al file
	FILE *flusso;

	/* apre il flusso del file */
	flusso = fopen("miofile.txt", "r");

	/* Codice che lavora sul file */
	[...]

	/* chiude il flusso del file
	fclose(flusso);
} 
Una volta aperto un file con la funzione fopen(), possiamo usare due funzioni per accedervi: la fprintf() e la fscanf() che operano sul flusso (stream) del file aperto da fopen() in modo analogo alle operazioni che scanf() e printf() compiono sul flusso dei dati verso la tastiera (standard input - stdin) o verso il monitor (standard output - stdout).

La forma con la quale si presentano le due funzioni è la seguente:

fprintf(flusso, stringa_segnaposto, variabili_da_scrivere);
fscanf(flusso, stringa_segnaposto, variabili_da_leggere)

Esempi possibili dell'uso di queste funzioni potrebbero essere:
fprintf(flusso, "%d", num);
che scrive il valore numerico in num nel file
fscanf(flusso, "%s", miastringa);
che legge dal file il valore di mia stringa.

L'operazione di lettura da un file non è possibile se il file è terminato e non ci sono più valori da leggere. è importantissimo quindi, prima di ogni operazione di lettura, controllare se si è raggiunta la fine del file sul quale si sta lavorando. Questo controllo è possibile con la funzione feof() che ritorna un valore true (vero) se si è raggiunta la fine del file.

Vediamo ora tre programmi di esempio.

Programma che acquisisce da tastiera N numeri e li memorizza nel file "numeri.dat"" uno per riga.

#include <stdlib.h>
#include <stdio.h>

int main()
{	FILE *flusso;
	int i, n, num;
	
	// Apertura del file
	flusso = fopen("numeri.dat", "w");
	
	// Acquisizione dei valori e scrittura nel file
	printf("Numero dei valori da scrivere nel file: ",i);scanf("%d",&n);
	for(i=0;i<n;i++)
	{	printf("%d"° numero: ",i);scanf("%d",&num);
		fprintf(flusso, "%d\n", num);
	}
	
	// chiusura del file	
	fclose(flusso);
    	
	system("PAUSE");
    	return 0;
}

Programma che legge dal file "numeri.dat" tutti i numeri presenti e ne calcola la media visualizzandola sullo schermo.

#include <stdlib.h>
#include <stdio.h>

int main()
{	FILE *flusso;
	int i=0, num;
	double s, m;
	
	// Apertura del file
	flusso = fopen("numeri.dat", "r");
	
	// Lettura dei valori dal file calcolo della media
	while (!feof(flusso))
	{	fscanf(flusso,"%d",&num);
		if (feof(flusso))
			break;
		s += num;
		i++;

	}
	m = s/i;

	// Visualizzazione della media
	printf("Media: %5.2f\n",m);	
	
	// chiusura del file	
	fclose(flusso);
    	
	system("PAUSE");
    	return 0;
}

Programma che legge dal file "tutti" tutti i numeri presenti e trascrive i soli numeri dispari sul file "dispari".

#include <stdlib.h>
#include <stdio.h>

int main()
{	FILE *f1, *f2;
	int i=0, num;
	double s, m;
	
	// Apertura del file
	f1 = fopen("tutti", "r");
	f2 = fopen("dispari", "w");
	// Lettura dei valori dal file f1 e scrittura in f2
	while (!feof(f1))
	{	fscanf(f1,"%d",&num);
		if (feof(f1))
			break;
		if (num % 2)
			fprintf(f2,"%d\n",num);
		s += num;
		i++;

	}
	
	// chiusura dei file	
	fclose(f1);
	fclose(f2);
    	
    	return 0;
}

Scrivi email per il tutor dei corsi
Scrivi email per l'amministratore del sito

Torna all'indice del corso
Ultima modifica: 08/04/2010