scusa ma non è che puoi postare quello che ti viene a video? sinceramente non ha capito cosa vuoi dire con "mi carica sempre tutto male"...si perde dei campi o ci sono caratteri spuri nei campi ? Siccome mi sono accorto che mi mancava un ungetc prova con questo:
codice:
int carica(FILE *f,automobile el[])
{
  int i,k;
  char tmp_c;

  for(i=0;!feof(f);i++){
    do
    {
       tmp_c = fgetc(f);
       if( feof(f) )
         return i;
    }
    while( (tmp_c == '!') || (tmp_c == '\r') || (tmp_c == '\n') );
    
    ungetc(tmp_c, f);
    for(k=0;(el[i].marca[k]=fgetc(f))!='!';k++);
    el[i].marca[k]='\0';
    for(k=0;((el[i].modello[k]=fgetc(f))!='!')&&!feof(f);k++);
    el[i].modello[k]='\0';
    fscanf(f,"%f!",&(el[i].prezzo));
  }
  return i;
}