Realizziamo alcuni esempi sui file di record, al fine di consolidare le funzioni sui file studiate finora. Faremo l’accesso in maniera sequenziale, mentre più avanti studieremo l’accesso diretto. Ricordiamo inoltre che sui file di record le operazioni vengono effettuate un record alla volta.

In modo particolare approfondiremo oggi le funzioni fread e fwrite per la lettura e scrittura sui file binari. Impareremo anche a scrivere il contenuto di un vettore di record su un file binario.

Esempi su file di record

Creare una struct studente che contiene il nome, il cognome e il voto. Dopo inserire 5 studenti e memorizzarli in una tabella s di tipo studente. Infine copiare i dati in un file binario di nome archivi.txt.

Quindi definiamo una struttura studente come descritta nel problema e creiamo la tabella s di tipo studente che conterrà 5 elementi.

Dopo con un semplice ciclo for inizializziamo la tabella s con i dati inseriti dall’utente. Visualizziamo anche il contenuto del record, semplicemente come prova dell’inserimento, non sarebbe infatti necessario. Poi apriamo il file binario archivi.txt in scrittura e controlliamo eventuali messaggi di errore.

Infine copiamo il contenuto del record nel file binario utilizzando la funzione fwrite.

Banner Pubblicitario

Ecco dunque il listato completo:

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

#define N 2
typedef struct { 
	char nome[20];
	char cognome[20];
	int voto;
} studente;

studente s[N];

main(){
	int i;
	FILE *file;

	for(i=0;i<N;i++) {
		printf("\nInserisci il nome:");
		scanf("%s",s[i].nome);
		printf("Inserisci il cognome:");
		scanf("%s",s[i].cognome);
		printf("Inserisci il voto:");
		scanf("%d",&s[i].voto);
}

/*visualizzo il contenuto del record*/
	for(i=0;i<N;i++) {
		printf("%s %s %d\n",s[i].nome, s[i].cognome,s[i].voto );
}

	if((file=fopen("archivi.txt", "wb"))==NULL) {
		printf("Errore nell'apertura del file");
		exit(1);
	}
	
	fwrite(&s,sizeof(studente),N,file);
	fclose(file);
}

Adesso creiamo un altro programma per leggere il file binario appena creato, chiaramente si poteva integrare anche nell’esempio sopra, inserendo solo l’operazione di lettura.

Per leggere dal file binario utilizzo la funzione fread.

Allego quindi il listato completo:

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

typedef struct{
	char nome[20];
	char cognome[20];
	int voto;
}studente;

int main(){
	FILE *fp;
	studente s;

	if((fp=fopen("archivi.txt", "rb"))==NULL) {
		printf("Errore nell'apertura del file");
		exit(1);
	}

	while(fread(&s, sizeof(studente),1, fp)>0)
		printf("%s\t%s\t%d\n",s.nome,s.cognome,s.voto);

	fclose(fp);
	
	return 0;
}

Nella prossima lezione approfondiremo ancora i file di record e altre funzioni sui file in C.

Alcuni link utili

Indice argomenti linguaggio C

La funzione fopen

Banner pubblicitario

Funzione fscanf

Allocazione dinamica della memoria con malloc

Strutture in C

Realizzare un menù di scelta in C

Strutture complesse in C

Come sommare gli elementi della cornice esterna

Come sommare due matrici

Matrice trasposta

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C