Newsgroup: it.comp.lang.c
Titolo: aiuto per piacere

Ho un po' di problemi con la scrittura e lettura di un file ad accesso
casuale.
Qualcuno saprebbe dirmi dove sto sbagliando, per piacere?
#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 15 /* 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);
/* prototipi di funzioni */
void nuova(FILE*fp);
void cambia(FILE*fp);
void cancella(FILE*fp);
void stampa(FILE*fp);
FILE*fp;
/* variabili globali */
int a=0,b=0,n,BASE=1;
char pausa;
float media=0.0;
studente vet,v;
main()
{
int x;
if ((fp=fopen("prova","wb"))==NULL)
                        { printf("Il file non si può aprire");
                            exit(1);}
else {
            inizFile(fp);
            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: {
                                                    nuova(fp);
                                                    break;
                                                            }
                                    case 2: {
                                                    cambia(fp);
                                                    break;
                                                            }
                                    case 3:   {
                                                    cancella(fp);
                                                    break;
                                                            }
                                    case 4: {
                                                    stampa(fp);
                                                    break;
                                                            }
                                    case 0: printf("Il programma è
terminato. \n\n\n");
                                                    break;
                                    default:
                                                        printf("Non è stata
selezionata alcuna opzione.\n\n\n");
                               }
    }
while(x!=0);
}
scanf("%c",&pausa);
fclose(fp);
}
void inizFile (FILE*fp)
{
int i;
es esVuoto={"",0};     /* inizializzo una variabile di tipo es a zero */
studente 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(FILE*fp)                     /* funzione per aggiungere uno
studente al file */
{
int i,y,h,matr,num,x=0;
float med=0.0,me=0.0;
studente vett;
rewind(fp);
printf("Inserire la matricola (interi):\n");             /* assegnazione
della matricola */
scanf("%d",&matr);
for(i=1; i<=MAXSTUD; i++) {                         /* controllo che la
matricola sia libera */
                    fread(&v,sizeof(studente),1,fp);
                    if(matr==v.mat) x=1;
                    }
if(x!=1) {
                v.mat=matr;
                printf("%d\n",v.mat);
                printf("Inserire nome:\n");
                scanf("%s",&v.nome);                 /* inserimento del nome
*/
                printf("Inserire cognome:\n");
                scanf("%s",&v.cognome);         /* inserimento del cognome
*/
                do {
                        printf("Inserire numero di esami sostenuti:\n");
                        scanf("%d",&v.numEs);       /* inserimento numero di
esami sostenuti con controllo sul numero minimo e massimo di esami    */
                        y=v.numEs;
                        if (y==0) printf("Non sono stati sostenuti
esami.\n");
                    }
                while (y<0 || y>25 );
for(n=0;n<y;n++) {
                                    printf("Inserire nome dell'esame:\n");
/* inserimento nome dell'esame */
                                    scanf("%s",&v.elEs[n].nomees);
                                    do {
                                            printf("Inserire voto
dell'esame:\n");
                                            scanf("%d",&num);         /*
inserimento voto dell'esame con controllo che il voto sia compreso tra 18 e
30 */
                                            }
                                    while (num<18 || num>30);
                v.elEs[n].voto=num;
                med=med+num;
    }
v.media=med/y;
fseek(fp,(v.mat-BASE)*sizeof(studente),SEEK_SET);             /*
posizionamento del puntatore al file */
fwrite(&v, sizeof(studente),1,fp);             /* scrittura su file */
}
else printf("Matricola già utilizzata.\n");
fseek(fp,-sizeof (studente),-sizeof (studente));
fread(&vett,sizeof(studente),1,fp);
printf("%d\t%s\t%s\n",vett.mat,vett.nome,vett.cognome);
}
void cambia (FILE *fp)
{
}
void cancella (FILE*fp)
{
}
void stampa (FILE*fp)
{
}
Grazie.

 ha scritto nel messaggio
news:XuvC8.23366$CN3.7...@news2.tin.it...


 ha scribite:
[...]
Non ti č neanche passato per la testa di eliminare un po' di testo,
vero?
La prossima volta rispondi scrivendo la risposta *sotto* al messaggio
originario, riportandone solo le parti indispensabili alla comprensione
della discussione.
-- 
Saluti,
    Mardy
http://castellina.org/interlingua