Salta ai contenuti. | Salta alla navigazione

Strumenti personali

fwrite e sizeof

Importante

...se nel frattempo potesse aiutarmi a risolvere questi due problemi che si sono presenteti nella compilazione della prova facoltativa le sarei molto grato... Qui di seguito ho copiato il file di testo del programma con evidenziato tra **** il punto dove si trova l'errore****

    typedef struct  {
int codice;
char nome[50];
char genere[30];
int annouscita;
} disco;

[...]

disco D[N];

****fwrite(D[i].codice,sizeof(???),1,pfb);****
fwrite(D[i].nome,sizeof(50),1,pfb);
fwrite(D[i].genere,sizeof(30),1,pfb);
****fwrite(D[i].annouscita,sizeof(???),1,pfb);****

Il problema è che il primo parametro della fwrite deve essere un puntatore, un indirizzo di un'area di memoria da cui la funzione fwrite preleva i dati da scrivere sul file. Nel caso del genere e del nome, essi sono array, che sono trattati come puntatori dal C, per cui non ci sono problemi. Nel caso del codice e dell'anno di uscita, invece, sono degli interi. In questo caso, quindi, dovrebbe utilizzare il riferimento alla variabile, usando l'operatore &

    fwrite(&D[i].codice,...
fwrite(&D[i].annouscita,...

Noti anche che l'operatore sizeof non è usato correttamente: sizeof restituisce l'occupazione in memoria (in byte) di un tipo di dato, di una variabile oppure di una costante. Provi ad eseguire questo semplice programma:

    #include <stdio.h>
main()
{ char X[30];
printf("char: %d\n", sizeof(char));
printf("30: %d\n",sizeof(30));
printf("int: %d\n",sizeof(int));
printf("X: %d\n",sizeof(X));
}

Come avrà intuito dal risultato dell'esecuzione, con

fwrite(D[i].genere,sizeof(30),1,pfb);

non sta dicendo al programma di scrivere 30 byte, ma di scrivere un numero di celle pari a...

Inoltre, che cosa dovremmo mettere al posto dei punti interrogativi che lei ha lasciato?