Se lasci la fopen nella funzione allora questa deve essere corretta così
void deleteUser()
{
FILE *scrittura = fopen("dati_utente.dat", "rb+");
if (scrittura == NULL) {
fprintf(stderr, "\nError opening file\n");
exit(1);
}
else {
puts("Inserire ID dell'account da cancellare.");
int idDelete;
scanf("%d", &idDelete);
int fnd = 0;
int elsw, chsz = sizeof(struct generalUser);
while (fread(&user, chsz, 1, scrittura))
{
if (idDelete == user.id)
{
memset(&user, 0, sizeof(user));
strcpy(user.fName, "Utente_eliminato");
fseek(scrittura, -chsz, SEEK_CUR);
elsw = fwrite(&user, chsz, 1, scrittura);
fnd = 1;
break;
}
}
if (!fnd)
puts("Id non trovato\n");
else
{
if (1 == elsw)
puts("Utente eliminato\n");
else
puts("ERRORE durante la scrittura\n");
}
}
fclose(scrittura);
}
Considera che il file deve essere aperto in binario rb+ ed è necessaria la chiamata alla fseek quando si passa dalla fread alla fwrite (ricorda che la fread sposta il puntatore al prossimo record e quindi, prima della fwrite, devi tornare indietro al record precedente).
Per provare, ti consiglio prima di cancellare il file .dat e ricrearlo in modo da essere certo di cosa contenga.