Sve@r | Gattuso a écrit :
Bonjour,
j'aurais besoin d'aide car je n'obtiens pas de fichier trié
Code :
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- int tri(FILE *flotLecture, FILE *flotEcriture,
- int(*cmp)(const char *s1, const char *s2))
- {
- char ligne1[15];
- char ligne2[15];
-
- if(flotLecture == NULL)
- return 1;
-
- if(flotEcriture == NULL)
- return 1;
-
- long courant;
- while(fgets(ligne1, sizeof ligne1, flotLecture) != NULL)
- {
- courant = ftell(flotLecture);
-
- while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL)
- {
- if((*cmp)(ligne1,ligne2) > 0)
- {
- char buf[BUFSIZ];
-
- strcpy(buf,ligne1);
-
- char *tmp1 = malloc(strlen(ligne2)+1);
- if(tmp1 == NULL)
- return 1;
- strcpy(tmp1,ligne2);
-
- char *tmp2 = malloc(strlen(buf)+1);
- if(tmp2 == NULL)
- return 1;
- strcpy(tmp2,buf);
-
- fprintf(flotEcriture,"%s",tmp1);
- free(tmp1);
- free(tmp2);
-
- }
-
- }
-
- fseek(flotLecture,courant,SEEK_CUR);
-
- }
-
- fclose(flotEcriture);
- fclose(flotLecture);
-
- return 0;
- }
- int main(int argc, char *argv[])
- {
- FILE *lecture = fopen("lire","r" );
- FILE *ecriture = fopen("ecrire","w" );
-
- if(tri(lecture,ecriture,&strcmp))
- {
- fprintf(stderr,"erreur \n" );
- }
-
- return EXIT_SUCCESS;
- }
|
|
Sincèrement, j'ai pas envie de réfléchir sur l'algo parce que je suis en WE. Donc je te donne juste des réflexions très générales que je remarque juste en première lecture
1) ça sert à rien que la fonction teste les flots car c'est un appel inutile (empilement, dépilement, etc). Vaut mieux tester les flots dans le main et n'appeler la fonction que s'ils sont corrects
2) penser à fermer les fichiers dans le main
3) le malloc est un peu inutile puisque la zone ne dépassera pas 15 car. Autant déclarer de suite tmp1 et tmp2 comme des tableaux de 15 octets. Mais si tu tiens quand-même au malloc, alors faut le faire bien. C'est à dire que si tmp2 n'a pas pu être alloué, faut libérer tmp1 avant de quitter la fonction.
4) je vois pas trop à quoi sert "buf"... mais je ne vois aucune définition de "BUFSIZ" => je m'étonne que ça compile chez toi
5) le pointeur sur "strcmp" est inutile... sauf si tu veux t'entrainer à utiliser des pointeurs de fonction. Dans ce cas, le code est correctement écrit
6) on déclare toutes les variables avant la première instruction du bloc => la déclaration "long courant" est mise après les instructions "if" et la déclaration "char *tmp2" est mise après les instructions "if(...)" et "strcpy(...)" => je m'étonne encore plus que ça compile chez toi (sauf si tu compiles en C++)
7) de façon conventionnelle, une fonction en erreur est plus sensée renvoyer "-1" que "1". Mais c'est vraiment du détail et ça n'influe en rien sur l'algo.
Sinon, comme j'ai pas envie de réfléchir sur l'algo en lui-même, la seule solution qu'il te reste est de prendre un papier et un crayon et de dérouler l'algo à la main. Comme ton fichier ne fait que 5 lignes, ça devrait pas être trop long... ---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
|