IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Trier un fichier


Sujet :

C

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut Trier un fichier
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    un
    deux
    trois
    quatre
    cinq
    Dans le fichier ecrire,j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    deux
    trois
    quatre
    cinq
    qui n'est pas trié et il manque le "un"

    Voici le code que j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #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)
        while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL)
          {
    	char *tmp1;
    	if((*cmp)(ligne1,ligne2) > 0)
    	  {
    	    char buf[BUFSIZ];
    	    strcpy(buf,ligne1);
     
    	    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);
          }
      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;
    }

  2. #2
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Cette boucle est dangereuse et ne fait absolument pas ce que tu veux:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    while(fgets(ligne1, sizeof ligne1, flotLecture) != NULL)
        while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL)  //Une fois que ceci rend NULL, il le fera à chaque fois
          {
       char *tmp1;
       if((*cmp)(ligne1,ligne2) > 0)
         {
           char buf[BUFSIZ];                   
           strcpy(buf,ligne1);
     
           tmp1  = malloc(strlen(ligne2)+1);  //Et le free??
           if(tmp1 == NULL)
             return 1;
           strcpy(tmp1,ligne2);      
     
           char *tmp2 = malloc(strlen(buf)+1);  //Et le free??
           if(tmp2 == NULL)
             return 1;
           strcpy(tmp2,buf);  //où est l'intérêt d'avoir un tmp2???
         }
       fprintf(flotEcriture,"%s",tmp1); //tmp1 n'est pas toujours défini... DANGEREUX
          }
    As-tu réflechis à ces points:

    - Que se passe-t-il si le if n'est pas vrai lors de la première itération?
    - Lorsque la deuxième boucle termine, on lit la deuxième ligne dans ta variable ligne1. Est-ce que tu penses que la boucle interne va être gentillement mis à sa place?
    - Quel est l'algorithme que t'utilise pour faire ton programme?
    - Est-ce que chaque allocation dynamique est bien désallouée à la fin du programme?

    Si tu n'as pas beaucoup de lignes, pourquoi ne pas tout lire dans un tableau à deux dimensions, utiliser la fonction qsort ou faire une fonction qui trie le tableau et après écrire le tableau?

    Jc

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    As -tu testé ton algo à la main ??
    Déjà tel quel il est incorrect et après il faudra le faire tourner plusieurs fois pour qu'il finisse pas donner un fichier trié.

  4. #4
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par fearyourself
    Cette boucle est dangereux et ne fait absolument pas ce que tu veux:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    while(fgets(ligne1, sizeof ligne1, flotLecture) != NULL)
        while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL)  //Une fois que ceci rend NULL, il le fera à chaque fois
          {
       char *tmp1;
       if((*cmp)(ligne1,ligne2) > 0)
         {
           char buf[BUFSIZ];                   
           strcpy(buf,ligne1);
     
           tmp1  = malloc(strlen(ligne2)+1);  //Et le free??
           if(tmp1 == NULL)
             return 1;
           strcpy(tmp1,ligne2);      
     
           char *tmp2 = malloc(strlen(buf)+1);  //Et le free??
           if(tmp2 == NULL)
             return 1;
           strcpy(tmp2,buf);  //où est l'intérêt d'avoir un tmp2???
         }
       fprintf(flotEcriture,"%s",tmp1); //tmp1 n'est pas toujours défini... DANGEREUX
          }
    As-tu réflechis à ces points:

    - Que se passe-t-il si le if n'est pas vrai lors de la première itération?
    si le if n'est pas vrai ,le programme ne fait rien

    - Lorsque la deuxième boucle termine, on lit la deuxième ligne dans ta variable ligne1. Est-ce que tu penses que la boucle interne va être gentillement mis à sa place?
    Comment faire pour que ligne2 soit la ligne suivante de ligne1 lorque la 1 ere boucle while rédémarre

    - Quel est l'algorithme que t'utilise pour faire ton programme?
    par exemple pour un fichier contenent
    ligne1 -> un
    ligne2 -> deux
    trois
    quatre

    ligne2 est comparé à chaque fois à ligne1.
    Si ligne1 est > à ligne2 (dans l'ordre lexicographique) ,j'échange les 2 noms
    sino rien

    - Est-ce que chaque allocation dynamique est bien désallouée à la fin du programme?

    Si tu n'as pas beaucoup de lignes, pourquoi ne pas tout lire dans un tableau à deux dimensions, utiliser la fonction qsort ou faire une fonction qui trie le tableau et après écrire le tableau?

    Jc
    Je dois faire un tri en utilisant un tableau (que j'ai code) et en utilisant 2 fichiers (code qui ne fonctionne pas)

  5. #5
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Man_Utd
    si le if n'est pas vrai ,le programme ne fait rien
    Je ne suis pas d'accord. La ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf(flotEcriture,"%s",tmp1);
    sera exécutée avec tmp1 non initialisée.

    Comment faire pour que ligne2 soit la ligne suivante de ligne1 lorque la 1 ere boucle while rédémarre
    A la place de poser directement la question, est-ce que tu y a pensé?

    Si tu voulais vraiment faire un tri avec un fichier en entrée, les fonctions fseek, ftell pourraient peut-être te servir...

    Si ligne1 est > à ligne2 (dans l'ordre lexicographique) ,j'échange les 2 noms
    sino rien
    Par rapport à ton code, c'est faux... Echanger veut dire que tu modifies le fichier en entrée et donc pour la suite de l'algo tu suppose que l'échange a été fait. Ce qui n'est pas vrai.

    Imagine que tu fais un tri sur un tableau const, tu aurais le même problème.

    Je dois faire un tri en utilisant un tableau (que j'ai code) et en utilisant 2 fichiers (code qui ne fonctionne pas)
    Si tu peux utiliser un tableau, je ne comprends pas pourquoi tu ne lis pas le fichier dans le tableau et après tu tries le tableau... Sérieusement, comme TrapD l'a souligné, prend ton fichier exemple et fait tourner ton algorithme à la main, tu verras qu'il ne fonctionne pas (et pourquoi).

    Jc

  6. #6
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    J'ai modifié le code mais maitenant j'obtiens dans le fichier "ecrire" ce qu'il y a dans le fichier "lire".

    Le tri n'est pas réalisé


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #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);
     
    	      fprintf(flotEcriture,"%s",meilleur_ligne_trouvee);
    	    }
    	}
     
          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;
    }

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fseek(flotLecture,0L,SEEK_END);
    La logique de cette ligne m'échappe surtout lorsque juste après tu as:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fgets(ligne2, sizeof ligne2, flotLecture) != NULL)
    Est-ce que tu penses vraiment, que cet appel arrivera à faire quelque chose?

    Ensuite, le tableau tmp te sert à quoi?

    Je vais le dire une dernière fois: Prends un exemple sur feuille, regarde ce que fait ton programme et tu verras tout de suite les erreurs ou aberrations. Si tu veux continuer ce post, tu vas surement corriger le code, voir que cela ne fonctionne toujours pas et mettre une 3ème version qui ne fonctionne pas.

    Cela fera la 3ème fois où je te conseille de lire le fichier directement dans un tableau et trier le tableau.

    Si tu ne peux pas, avant de mettre ton code, mets un exemple et explique ligne par ligne ce que ton code fait.

    Jc

  8. #8
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par fearyourself
    Prends un exemple sur feuille, regarde ce que fait ton programme et tu verras tout de suite les erreurs ou aberrations.

    Jc

    J'ai fait tourné le programme à la main mais ne je ne vois pas ou est le problème.


    Sinon concernant mon code pour trier un tableau.
    Dans ma fonction triTab,est ce que quelqu'un pourrait m'expliquer pour quoi j'ai un segfault lorsque j'écrit ce que j'ai mis entre commentaire car pour affecter une valeur,il faut que la variable soit suffisament grande
    Tout va bien lorque je mets ces lignes entre /**/


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    int triTab(char **tab, int(*cmp)(const char *s1, const char *s2))
    {
      char **p1,**p2;
     
      for(p1=tab; *p1!=NULL; p1++)
        for(p2=p1+1; *p2!= NULL; p2++)
          if((*cmp)(*p1,*p2) > 0)
    	{
    	  char buf[BUFSIZ];
     
    	  strcpy(buf,*p1);
     
    	  /*p1 = malloc(strlen(*p2)+1);
    	    if(p1 == NULL)
    	    return 1;*/
    	  strcpy(*p1,*p2);
     
     
    	  /*p2 = malloc(strlen(buf)+1);
    	    if(p2 == NULL)
    	    return 1;*/
    	  strcpy(*p2,buf);
     
     
    	}
     
      return 0;
    }
     
     
     
    int main(int argc, char *argv[])
    {
      char **t = malloc(sizeof(char *)*argc);
      if(t == NULL)
        {
          fprintf(stderr,"erreur \n");
          return EXIT_FAILURE;
        }
     
      int l = argc-1;
      int i;
     
      for(i = 0; i<l; i++)
        {
          t[i] = malloc(strlen(argv[i+1])+1);
          if(t[i] == NULL)
    	{
    	  fprintf(stderr,"erreur \n");
    	  return EXIT_FAILURE;
    	}
     
          strcpy(t[i],argv[i+1]);
     
        }
     
      t[l] = NULL;
     
      if(triTab(t,&strcmp))
        {
          printf("erreur \n");
          return EXIT_FAILURE;
        }
     
      for(i = 0; i < l; i++)
        printf("%s ",t[i]);
     
      printf("\n");
     
      return EXIT_SUCCESS;
    }

  9. #9
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    for(p1=tab; *p1!=NULL; p1++)
      for(p2=p1+1; *p2!= NULL; p2++)
          if((*cmp)(*p1,*p2) > 0)
       {
         char buf[BUFSIZ];
     
         strcpy(buf,*p1);
     
         /*p1 = malloc(strlen(*p2)+1);
           if(p1 == NULL)
           return 1;*/
         strcpy(*p1,*p2);
     
     
         /*p2 = malloc(strlen(buf)+1);
           if(p2 == NULL)
           return 1;*/
         strcpy(*p2,buf);
     
     
       }
    Te semble-t-il logique/une bonne idée de modifier tes itérateurs en pleins milieu du corps de ta boucle? En plus, tu fait encore des malloc sans faire de free derriere...

    En plus, les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p2 = malloc(strlen(buf)+1);
           if(p2 == NULL)
           return 1;
    strcpy(*p2,buf);
    Est-ce qu'après le malloc *p2 est initialisé????

  10. #10
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par fearyourself
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    for(p1=tab; *p1!=NULL; p1++)
      for(p2=p1+1; *p2!= NULL; p2++)
          if((*cmp)(*p1,*p2) > 0)
       {
         char buf[BUFSIZ];
     
         strcpy(buf,*p1);
     
         /*p1 = malloc(strlen(*p2)+1);
           if(p1 == NULL)
           return 1;*/
         strcpy(*p1,*p2);
     
     
         /*p2 = malloc(strlen(buf)+1);
           if(p2 == NULL)
           return 1;*/
         strcpy(*p2,buf);
     
     
       }
    Te semble-t-il logique/une bonne idée de modifier tes itérateurs en pleins milieu du corps de ta boucle? En plus, tu fait encore des malloc sans faire de free derriere...
    En plus, les lignes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p2 = malloc(strlen(buf)+1);
           if(p2 == NULL)
           return 1;
    strcpy(*p2,buf);
    Est-ce qu'après le malloc *p2 est initialisé????
    Je ne mets pas de free car je ne sais pas à quel moment dans le code ,il faut que je les place.

    C'est vrai que *p2 n'est pas initialisé

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Man_Utd
    Je ne mets pas de free car je ne sais pas à quel moment dans le code ,il faut que je les place.

    C'est vrai que *p2 n'est pas initialisé

    Réfléchis avant de programmer SVP

  12. #12
    Membre habitué
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Points : 174
    Points
    174
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    un
    deux
    trois
    quatre
    cinq
    j'obtiens dans "ecrire"
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #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);
        }
     
      free(tmp);  
     
      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;
    }

  13. #13
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Pour la quinzième fois, ton algorithme est faux et ne pourras pas marcher comme cela. Déjà, ce que tu chercherais serais plutôt,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(flotLecture,courant,SEEK_SET);
    et non

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     fseek(flotLecture,courant,SEEK_CUR);
    Et après, il te manque un principe fondamental à ton tri:

    - enlever le minimum que tu viens d'ajouter dans ton deuxième fichier

    Ensuite, juste un petit détail:

    - Suppose que le premier élément n'est pas le minimum, tu ne le gardes pas en mémoire, et il n'est jamais revu par l'algorithme. Donc tu l'as perdu... Est-ce que ça te semble logique?

    Je vais le redemander, mais à part pour faire un exercice pour un prof, y-a-t-il un fondement ou une bonne raison que tu t'acharnes à faire quelque chose qui n'est pas logique?

    Jc

Discussions similaires

  1. trier les fichiers dans l'explorateur windows
    Par imeys dans le forum Windows XP
    Réponses: 1
    Dernier message: 30/03/2006, 23h52
  2. trier des fichiers avec un tableau flexgrid
    Par digger dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 08/12/2005, 15h20
  3. Trier un fichier
    Par enicnath dans le forum Général Python
    Réponses: 5
    Dernier message: 10/11/2005, 17h31
  4. [XSLT] - Trier un fichier sur plusieurs critères
    Par ytse dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/10/2005, 16h26
  5. Trier les fichiers par type et les afficher par groupe ...
    Par KneXtasY dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 18/09/2005, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo