> Tous les forumsAutres langages

 Trier un fichier en C
Statut du sujet : NON RESOLU Imprimer
 Premium
  Posté le 20/01/2006 @ 16:34  
 Petit astucien

205 Messages
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. j'obtiens dans le fichier "ecrire" ce qu'il y avait dans le fichier "lire". Le tri n'est pas fait Est ce que quelqu'un aurait une idée de ce que je dois modifier pour que mon code fonctionne? Si vous pouviez m'aider. Merci d'avance Mon fichier lire est le suivant: [code]un deux trois quatre cinq[/code] [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; while(fgets(ligne1, sizeof ligne1, flotLecture) != NULL) { long courant = ftell(flotLecture); fseek(flotLecture,0L,SEEK_END); char meilleur_ligne_trouvee[15],tmp[15]; strcpy(meilleur_ligne_trouvee,ligne1); while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL) { if((*cmp)(meilleur_ligne_trouvee,ligne2) > 0) { char buf[BUFSIZ]; strcpy(buf,meilleur_ligne_trouvee); strcpy(meilleur_ligne_trouvee,ligne2); strcpy(tmp,buf); } } fseek(flotLecture,courant,SEEK_SET); fprintf(flotEcriture,"%s",meilleur_ligne_trouvee); } fclose(flotEcriture); fclose(flotLecture); return 0; } int main() { FILE *lecture = fopen("lire","r"); FILE *ecriture = fopen("ecrire","w"); if(tri(lecture,ecriture,&strcmp)) { fprintf(stderr,"erreur \n"); } return 0; }[/code]
 Afficher le profil de PremiumEnvoyer un message privé à Premium
 
 
Publicité
 don diego  Posté le 20/01/2006 à 20:50  
Petit astucien

323 Messages
Salut, tu veux trier quoi?
Afficher le profil de don diegoEnvoyer un message privé à don diego
 Revenir en haut de la page
 Premium  Posté le 21/01/2006 à 06:42  
Petit astucien

205 Messages
don diego a écrit :
Salut, tu veux trier quoi?
Je souhaite trier un fichier contenant un mot par ligne par exemple [code]un deux trois quatre cinq[/code] et écrire le résultat dans un autre fichier PS:je souhaite trier le fichier en utilisant fseek et ftell,sans passer par un tableau
Afficher le profil de PremiumEnvoyer un message privé à Premium
 Revenir en haut de la page
 don diego  Posté le 21/01/2006 à 08:50  
Petit astucien

323 Messages
Désolé, je ne comprends toujours pas. Tu veux les trier par ordre alphabétique?
Afficher le profil de don diegoEnvoyer un message privé à don diego
 Revenir en haut de la page
 Premium  Posté le 21/01/2006 à 09:21  
Petit astucien

205 Messages
don diego a écrit :
Désolé, je ne comprends toujours pas. Tu veux les trier par ordre alphabétique?
Oui par ordre alphabétique 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]un deux trois quatre cinq [/code] j'obtiens dans "ecrire" [code]cinq[/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] #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]; char *tmp; long courant; while(fgets(ligne1, sizeof ligne1, flotLecture) != NULL) { courant = ftell(flotLecture); while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL) { if((*cmp)(ligne1,ligne2) > 0) { tmp = malloc(strlen(ligne2)+1); if(tmp == NULL) return 1; strcpy(tmp,ligne2); } } fprintf(flotEcriture,"%s",tmp); fseek(flotLecture,courant,SEEK_CUR); } return 0; } int main(int argc, char *argv[]) { FILE *lecture = fopen("lire","r"); FILE *ecriture = fopen("ecrire","w"); if(lecture == NULL) return EXIT_FAILURE; if(ecriture == NULL) return EXIT_FAILURE; if(tri(lecture,ecriture,&strcmp)) { fprintf(stderr,"erreur \n"); return EXIT_FAILURE; } fclose(ecriture); fclose(lecture); return EXIT_SUCCESS; } [/code]

Modifié par Premium le 21/01/2006 15:44
Afficher le profil de PremiumEnvoyer un message privé à Premium
 Revenir en haut de la page
 don diego  Posté le 23/01/2006 à 08:54  
Petit astucien

323 Messages
A la fin de ta fonction tri, tu fais : fseek(flotLecture,courant,SEEK_CUR); Mais il faut que tu replaces ton pointeur au début du fichier : fseek(flotLecture, courant, SEEK_SET);
Afficher le profil de don diegoEnvoyer un message privé à don diego
 Revenir en haut de la page
Haut de la page 
Inscrivez-vous !
- Posez vos questions

- Résolvez vos problèmes

- Aidez les autres

- Participez et créez vos discussions

- Dialoguez en privé avec d'autres membres

- Suivez vos sujets préférés

- Affichez les signatures des membres

TOUT EST GRATUIT !

Je crée mon compte



Vous avez besoin d'aide ?
Des centaines d'experts sont à votre disposition sur les forums PC Astuces pour vous aider gratuitement, 24h/24, 7j/7.

Les derniers sujets résolus !
 

 > Tous les forumsAutres langages

 
Forum PC Astuces© 1997-2008 WebastucesAller en haut de la page