Regrouper les informations d'un fichier c est les afficher

amdsources Messages postés 6 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 10 août 2010 - 3 juin 2010 à 12:42
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 - 3 juin 2010 à 19:10
BONJOUR,
Je suis en train de creer un programme qui permet de lire les informations dans un fichier
les regrouper et aditionner la somme exemple :

dans mon fichier il y a :

100 : 1200
120 : 1000
100 : 200
101 : 300
102 : 400
103 : 1000
101 : 1200

a la fin je vais avoir :

100 : 1200
100 : 200
-----
total:1400

101 : 300
101 : 1200
----
Total: 1500
et ainsi de suite ..

voici mon code :

int main()
{ float tab[792];
struct enrg a;FILE *p;
int i;

for(i=0;i<792;i++)
{
tab[i]=0;
}



p=fopen("journal","a+");
if(p!=NULL)
{

while(fread(&a,sizeof(struct enrg),1,p),!feof(p))
{
tab[a.numero]=tab[a.numero]+a.tot1;
printf("%s %.2f",a.numero,a.tot1);
}
printf("%.2f\n",tab[a.numero]);

}
else printf("erreur d'ouverture ");




fclose(p);
return 0;

3 réponses

TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 juin 2010 à 13:36
Salut,

float tab[792];

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.
0
amdsources Messages postés 6 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 10 août 2010
3 juin 2010 à 13:46
Merci d'avoir pris le temps de lire mon message
mais le probleme c'est comment trir les informations retournés far fread().
0
TychoBrahe Messages postés 1309 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 5 juin 2013 12
3 juin 2010 à 19:10
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.
0
Rejoignez-nous