| | 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]
| | |
| |
| Publicité |
|
| | don diego | Posté le 20/01/2006 à 20:50 | Petit astucien
323 Messages
| Salut,
tu veux trier quoi? | | | | | 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 | | | | | 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? | | | | | 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 | | | | | 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); | | | |
| | 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
|
|