Ci eserciteremo oggi sui file di record con numeri random, per il momento con accesso sequenziale.

Anche in questa lezione riprenderemo le funzioni fread, fwrite, fopen e fclose che abbiamo già studiato nelle lezioni precedenti.

Riprendiamo l’esercizio della lezione precedente, introducendo un campo matricola che verrà assegnato random dal sistema in modo tale che sia unico.


Esempi di file di record con numeri random

Creare una struct studente che contiene la matricola, il nome, il cognome e il voto. Il campo matricola dovrà essere generato dal sistema come numero random ad esempio tra 1000 e 1999. Quindi inserire 10 studenti e memorizzarli in una tabella s di tipo studente. Infine copiare i dati in un file binario di nome archivi.txt.

Quindi creaimo un struttura studente e una tabella s che contiene 10 studenti. Generiamo dei numeri casuali con la funzione rand() in modo tale che non ci siano ripetizioni. Per evitare ripetizioni inserisco un altro ciclo for interno che scandisce con un indice j il vettore dall’inizio fino alla posizione in cui si è arrivati con l’indice i. Ovviamente ci possono essere altri metodi per evitare ripetizioni, provate a pensare una soluzione alternativa e inseritela pure nei commmenti sotto.

Stampiamo, solo per controllare i dati inseriti, il nostro vettore e poi ne inseriamo il contenuto nel file archivi.txt utilizzando la funzione fwrite.

Banner Pubblicitario

Chiaramente prima il file deve essere aperto con la funzione fopen.

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

#define N 10

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

studente s[N];

int main(){
	int i,j;
	FILE *fp;

	for(i=0;i<N;i++) {
		s[i].id=rand()%1000+1000;
    	        for(j=0;j<i;j++) {
                    if(s[i].id==s[j].id){
                         i--;
                         break;
        	    }
    	        }
	
               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);
       }

       for(i=0;i<N;i++) {
		printf("%d %s %s %d\n",s[i].id, s[i].nome, s[i].cognome,s[i].voto);
       }
	if((fp=fopen("archivi.txt", "wb"))==NULL) {
		printf("Errore nell'apertura del file");
		exit(1);
	}
	
	fwrite(&s,sizeof(studente),N,fp);
	fclose(fp);
	
	return 0;
}

Realizziamo adesso un altro programma che legge un file binario archivi.txt come quello appena creato.

Apriamo il file binario in lettura con la funzione fopen, poi con la funzione fread leggiamo il nostro file binario stampando a video i valori.

Ecco dunque il listato completo:

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

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

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

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

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

	fclose(fp);
	
	return 0;
}

Ecco dunque alcuni esempi sui file di record con numeri random, andando avanti nel tutorial ne affronteremo degli altri.

In questi esercizi per il momento stiamo omettendo i controlli dell’input che in seguito faremo opportunamente.

Alcuni link utili

Indice argomenti linguaggio C

Banner pubblicitario

La funzione fopen

Funzione fscanf

Allocazione dinamica della memoria con malloc

Come sommare gli elementi della cornice esterna

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C