Newsgroup: it.comp.lang.c
Titolo: fwrite???

Il mio esercizio era a grandi linee questo:
Si tratterà di gestire  un file ad accesso casuale di strutture con le
seguenti  informazioni relative agli studenti:
matricola
nome
cognome
numero esami sostenuti
elenco esami sostenuti e relativi e voti
media
La matricola, il numero dei voti e i voti stessi sono espressi da  interi,
la media da un float e nome, cognome e nomi degli esami  da stringhe.
Il file di dati é ad accesso casuale.
Si supponga  che i voti siano in trentesimi, che il numero massimo di esami
da superare per quel corso sia 25 e che il nome degli esami sia un codice
del formato Esi, per 1?i?25.
Vogliamo
1.aggiornare  periodicamente   il file con  i dati degli studenti,
aggiungendone uno nuovo,
2. aggiornare i dati di uno studente inserito, in particolare modificando
l'elenco degli esami sostenuti da uno studente già immatricolato,
aggiungendo nuovi esami.
3. cancellare  il record di uno studente, e infine
4. stampare  l'elenco dei primi cinque studenti in ordine  di media
visualizzando  a terminale  la  matricola,  il nome, il cognome e la media.
Ho cominciato a farlo e sono arrivata a questo punto:
#include <stdio.h>
#include <stdlib.h>
#define NUMES 25                    /* numero esami */
#define LUNG  15                      /* lunghezza delle stringhe */
#define MAXSTUD 10               /* massimo numero di studenti */
#define LUNGES 5                     /*  lunghezza del nome dell'esame */
typedef struct esame {
        char nomees[LUNGES];
        int voto;
        } es;
typedef es elEsami[NUMES];
typedef struct stud {
        int mat;
        char  nome[LUNG];
        char cognome[LUNG];
        int numEs;
        elEsami elEs;
        float media;
        }studente;
void inizFile(FILE*fp);
void nuova(struct stud *);
void cambia(struct stud *);
void cancella(struct stud *);
void stampa(struct stud *);
FILE*fp;
struct stud *vet;
int a=0,n,BASE=1;
char pausa;
float media=0.0;
main()
{
int x;
if ((fp=fopen("prova","w"))==NULL) printf("Il file non si può aprire");
else {
          inizFile(fp);
          if((vet=malloc(sizeof(struct stud)*MAXSTUD))==NULL) printf("Errore
di allocazione");
          do {
          printf("\n\n1.Aggiungi nuova matricola.\n");
          printf("2.Aggiorna matricola.\n");
          printf("3.Cancella matricola.\n");
          printf("4.Stampa i primi cinque con la media migliore.\n");
          printf("0.Per uscire dal programma.\n\n");
          scanf("%d",&x);
          switch (x) {
                case 1: {
                                a++;
                                nuova(vet);
                                break;
                                }
                case 2: cambia(vet);
                             break;
                case 3: cancella(vet);
                             break;
                case 4: stampa(vet);
                             break;
                case 0: printf("Il programma è terminato. Premere
invio.\n");
                             break;
                default:
                        printf("Non è stata selezionata alcuna
opzione.\n\n\n");
                }
           }
           while(x!=0);
          }
scanf("%c",&pausa);
scanf("%c",&pausa);
fclose(fp);
 }
void inizFile (FILE*fp)
{
int i;
es esVuoto={"",0};                                                /*
inizializzo una variabile di tipo es a zero */
struct stud studVuoto={0,"","",0,{{"",0}},0.0};            /* inizializzo
una variabile di tipo studente a zero */
for (i =1; i <= MAXSTUD; i++)
fwrite (&studVuoto,sizeof(studente),1,fp);            /* scrivo il file con
i record vuoti */
}
void nuova(struct stud *v)
{
int y,h,med=0;
char buff[500];
v[a].mat=a;
printf("Inserire nome:\n");
scanf("%s",&v[a].nome);
printf("Inserire cognome:\n");
scanf("%s",&v[a].cognome);
do {
printf("Inserire numero di esami sostenuti:\n");
scanf("%d",&v[a].numEs);
y=v[a].numEs;}
while (y<=0 || y>25 );
for(n=1;n<=y;n++)  {
printf("Inserire nome dell'esame:\n");
scanf("%s",&v[a]. elEs[n].nomees);
do {
printf("Inserire voto dell'esame:\n");
scanf("%d",&v[a].elEs[n].voto);
        }
while (v[a].elEs[n].voto<18 || v[a].elEs[n].voto>30);
 /* ... */
}
for(h=1;h<=y;h++){
med=med+v[a].elEs[h].voto;
media=med/y;
}
v[a].media=media;
fseek(fp,(v[a].mat-BASE)*sizeof(struct stud),SEEK_SET);
fwrite(&v, sizeof(struct stud),1,fp);
}
void cambia (struct stud *v)
{
/* ... */
}
void cancella (struct stud *v)
{
/* ... */
}
void stampa (struct stud *v)
{
/* ... */
}
ma ora non sono sicura che scriva correttamente il file.
Volevo sapere se è giusto e in che modo riesco a vedere cosa c'è sul file
che sto creando.
Grazie.
Chiara

$ man fread
poi fai na routine che legge il file e lo printa allo schermo....