Trier un fichier en C - C - Programmation
Marsh Posté le 20-01-2006 à 10:49:59
Problèmes principaux :
1. Une fois arrivé à la fin du fichier, il faut repartir plus haut (rembobiner) pour que l'algorithme choisi marche. Donc pour cela, il faut utiliser fseek (et ftell) ou bien fermer et réouvrir le fichier.
2. tmp2 n'est pas utilisé. Seul tmp1 est inscrit dans le fichier
3. Au lieu de compare ligne1 et ligne2, il faudrait comparer la meilleure ligne trouvée et ligne2, donc pour le premier enregistrement mettre ligne1 dans tmp1, ou inversement tmp1 dans ligne1.
Problèmes secondaires :
1. Ouverture de fichier sans fermeture
La fermeture permet de vider les buffers.
La fermeture est faite automatiquement à la fin, mais ce n'est pas une bonne habitude de ne pas la faire.
2. Allocation de mémoire sans libération
La libération est faite automatiquement à la fin, mais ce n'est pas une bonne habitude de ne pas la faire.
3. Allocation incohérente du tas et de la pile
Si l'on sait qu'une ligne a une longueur maximale de 15 caractères, alors, il est bien de faire char ligne1[15];, mais tmp1 = malloc(strlen(ligne2)+1); pourrait être avantageusement remplacé par char tmp1[15]; car malloc prend beaucoup de resource CPU et de ressource mémoire. L'utilisation de la pile pour des petites (moins de 2000 caractères) chaines est presque toujours préférable à l'utilisation du tas par un malloc(). Malloc() doit être utilisé avec parcimonie.
4. Choisir des noms plus parlant
Par exemple, au lieu de tmp1, choisir meilleur_ligne_trouvee
Marsh Posté le 21-01-2006 à 11:35:15
Bonjour,
j'aurais besoin d'aide car je n'obtiens pas de fichier trié
Code :
|
Marsh Posté le 21-01-2006 à 12:41:05
Gattuso a écrit : Bonjour,
|
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...
Marsh Posté le 21-01-2006 à 13:09:13
Sve@r a écrit : 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 |
Merci pour toutes ces remarques.
J'ai réécrit le code maintenant ça me fait le tri mais pour un seul élémént.
En partant de ce fichier "lire"
Code :
|
j'obtiens dans "ecrire"
Code :
|
Ce qui est bien le plus petit mot mais je ne comprends pas pourquoi la boucle ne continue pas alors que j'utilises fseek et ftell pour redémarrer les boucles.
Code :
|
Marsh Posté le 21-01-2006 à 14:04:11
Sve@r a écrit : mais je ne vois aucune définition de "BUFSIZ" => je m'étonne que ça compile chez toi |
C'est une constante standard définie dans <stdio.h>.
Marsh Posté le 21-01-2006 à 15:14:56
Emmanuel Delahaye a écrit : C'est une constante standard définie dans <stdio.h>. |
Ah ben merci. Au moins j'ai appris qqchose... il reste plus qu'à régler les 6 autres points... et puis à dérouler l'algo à la main. Ca devrait pas trop être difficile... mais comme je l'ai dit j'ai déconnecté le brain pour ce WE.
Marsh Posté le 20-01-2006 à 08:46:01
Bonjour,
le code suivant devrait (ce que j'èspère) lire le fichier "lire" et écrire dans le fichier "ecrire" les lignes du fichier précédent trié mais il ne fait pas cela.
Si vous pouviez m'aider.
Merci d'avance
Mon fichier lire est le suivant:
Dans le fichier ecrire,j'obtiens ceci :
qui n'est pas trié et il manque le "un"
Voici le code que j'ai écrit:
Message édité par Gattuso le 21-01-2006 à 06:51:43