[C] Fichier trié ?

Fermé
Premium - 20 janv. 2006 à 18:28
hibou57 Messages postés 130 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 4 juillet 2010 - 22 janv. 2006 à 18:06
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:
un
deux
trois
quatre
cinq






#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;
}
A voir également:

1 réponse

hibou57 Messages postés 130 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 4 juillet 2010 61
21 janv. 2006 à 02:36
As-salam alayk yâ Premium

Cette ligne de code m'intrigue...
fseek(flotLecture,courant,SEEK_SET);

- Où est déclarée la variable « courant » ?
- Comment varie t-elle ?
- Comment peut tu faire un seek pour écrire une ligne à une position donnée du fichier, sachant que tes lignes n'ont pas toutes la même longeur (je veux dire par là que tu ne peux pas inserer un ligne avant une autre sans avoir à re-écrire tout le fichier)

Je ne sais pas si tu veux absolument garder la même structure pour ton programme. Mais la meilleure solution serait de le re-écrire complétement.

Je te donne la structure shématique qui serait appropriée.

1) Ouverture du fichier source.
2) Chargement en mémoire de toutes les lignes dans un tableau de ligne.
3) Fermeture du fichier source.
4) Tris du tableau de ligne (dans un même tableau, ou un autre tableau).
5) Ouverture du fichier destination.
6) Ecriture du tableau de ligne triées dans le fichier destination.
7) Fermeture du fichier destination.

I wish this may help
0
Bonjour,

je dois trier le fichier en utilisant fseek et ftell sans passer par un tableau pour faire le tri.

Cet exo est à faire de 2 manières : en utilisant un tableau(je l'ai codé) et en utilisant 2 fichiers .
Avec cette seconde maniàre,je n'y arrive pas.

Est ce que vous pourriez m'aider svp.

Merci
0
hibou57 Messages postés 130 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 4 juillet 2010 61 > Premium
22 janv. 2006 à 18:06
Bonjour Premium,
Ok, si il est imposé de le résoudre ainsi, je comprends alors.

Je n'ai pas assez de temps, si tu veux je peux repasser demain ou mardi.

Je voulais te dire une chose que je pensais mais que j'avais oublié d'écrire dans le précédent message, c'est que tu as déjà un bon style pour quelqu'un qui commence. Tu choisis des noms de variable qui parle, et on sens que tu essai de soigner ton style d'écriture. C'est une trés bonne chose, et je te souhaite de toujours être comme ça, et de ne pas abandonner cette bonne habitude avec le temps... comme le font trop de programmeur(se)s malheureusement.
A bientôt

P.S. Même si je suis en retard, j'y penserai, c'est promis... bon week-end à toi et bon courage d'ici là.
0