Infatti ed ecco come l'ho risolto. fread non leggeva i 9700 bytes dopo la prima scrittura.
int salva(Paziente pazienti[],int dimP,int medico)
{
FILE *fp=NULL;
int i=0,pos,dim;
Paziente p = {0};
fpos_t temp = 0;
fp= fopen("pazienti","rb+");
if(fp==NULL)
{
printf("Errore nell'apertura dell'archivio pazienti\n");
return(0);
}
setvbuf(fp,NULL,_IONBF,0);
dim=sizeof(Paziente); //Usata per il debug
do
{
fread(&p,sizeof(Paziente),1,fp);
dim=sizeof(Paziente); //Usata per il debug (controllavo che dim(p) fosse costante)
pos=ftell(fp); //Usata per il debug (verifica posizione settata da fseek)
if(p.medico_curante == medico) //medico è un numero che identifica il medico, e deve corrispondere a p.medico_curante
{
temp = pos - dim;
fsetpos(fp,&temp);
fwrite(&pazienti[i],sizeof(Paziente),1,fp);
i++;
}
}while(i < dimP && !feof(fp));
fclose(fp);
return(1);
}
Il problema è il buffer interno allocato per il file, di default mi pare che sia di 4096 bytes. Devi attivare la modalità no buffering così appena scrivi o leggi i dati vengono rispecchiati immediatamente. Dalle prove che ho fatto fread non sbaglia un colpo, legge sempre 9700 bytes.