Dans ton exemple il n'y a que des nombres entiers. Si c'est toujours le cas, tu ne devrais pas utiliser le type float mais le type int (et même unsigned int s'ils sont toujours positifs).
for(i=0;i<792;i++)
{
tab[i]=0;
}
La fonction bzero() est ton amie ;)
bzero(tab, sizeof(tab));
else printf("erreur d'ouverture ");
Tu ne devrai pas écrire sur la sortie standard mais sur la sortie d'erreur standard. Enfin ce n'est plus un problème si tu utilises la fonction perror() qui affichera un message précis sur la bonne sortie.
p=fopen("journal","a+");
Si tu n'as pas besoin d'écrire dans le fichier (juste de lire comme c'est le cas dans ce que tu as montré), alors le mode "r" est suffisant (sauf sur windows où devrait être utile d'utiliser le mode "b" en plus).
while(fread(&a,sizeof(struct enrg),1,p),!feof(p))
Attention, tu ne vérifie pas si la lecture s'est déroulée sans erreurs. A noter qu'il me semble qu'il n'y a pas de moyen pour savoir si fread à effectivement lu le bon nombre d'octets dans le fichier (retourne 0 si la lecture est partielle sans positionner errno ni ne pointeur d'erreur du buffer, donc pas de perror ni de ferror). C'est dommage, un fichier corrompu risque de passer sans soucis.
mais le probleme c'est comment trir les informations retournés far fread().
ha trier les infos, il suffisais de le dire dès le début :)
Et bien tu vas devoir retenir toutes les informations, par exemple à l'aide d'une liste chaînée, pour ensuite les trier. Enfin à mon avis vu que tu utilises visiblement des données binaires le mieux serait de mapper le fichier en mémoire (en C sous windows je ne sais pas comment faire vu que windows ne connais pas mmap()...), mais ceci va t'obliger à revoir intégralement ta manière de faire. A toi de faire ta fonction de tri perso (il existe de très nombreux algorithmes de tri) ou d'utiliser une librairie qui implémente déjà ça.