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 :

Comparaison et tri en fonction du nom du fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 15
    Points
    15
    Par défaut Comparaison et tri en fonction du nom du fichier
    Bonjour à tous !
    voilà je suis actuellement en train de réaliser un projet en langage C et avec la bibliothèque gtk+.

    ce programme devra traiter des fichier .txt qui contiennent des informations (codes erreur , date , lieu ......) et afficher le dernier état du véhicule.
    De plus , on devra avoir accès à une historique des états antérieurs.



    Je rencontre deux problemes actuellement :

    1- J'ai crée une fonction "listerFichier (char const *directory)" qui permet de lister tout les fichiers d'un repertoire (ex. : directory = "C:\\Projet"), de trier les fichiers par ordre croissant, de les stocker dans un tableau de char "chaine[i]" et de les affichers.

    Mon probleme : je doit trier ces fichiers en fonction de la référence Z26XXX et dans l'ordre chronologique( la date figure dans le titre)

    Reférence Date format(.txt)

    Z26571_TING_180112_0956.txt
    Z26567_TING_130112_1017.txt
    Z26566_TING_210212_1024.txt
    Z26565_TING_230212_0958.txt
    Z26565_TING_060212_0954.txt
    Z26565_TING_060112_0958.txt
    Z26564_TING_030212_0941.txt
    Z26529_TING_200212_1001.txt
    .... il y a des centaines de fichiers de ce genre.

    après avoir trié , je copier tout les fichier avec la meme référence
    dans un meme fichier dans l'ordre chronologique.

    Ma fonction ne trie uniquement par ordre décroissant en lisant chaque caractere un a un.

    Je ne voi pas comment je pourrais procéder.

    Mon idée : récupérer le tableau "chaine[]" dans le main , lire le nom de chaque fichier caractere par caractere pour pouvoir ensuite trier.

    Mais je n'arrive pas à récupérer ce tableau.

    voici ma fonction :

    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
    void listerFichier (char const *directory)
    {
       DIR *dir = opendir (directory);
       if (dir != NULL)
       {
          char *chaine[512];
          int i = 0;
     
          printf ("Dossier : '%s'\n", directory);
          {
             struct dirent *file;
             while ((file = readdir (dir)) != NULL)
             {
                if (strcmp (file->d_name, ".") != 0
                    && strcmp (file->d_name, "..") != 0)
                {
                   chaine[i] = strdup (file->d_name);
                   if (i < sizeof chaine / sizeof *chaine)
                      i++;
                   else
                      break;
                }
     
             }
             closedir (dir);
          }
     
          {
             int n = i;
     
             for (i = 0; i < n; i++)
             {
                printf ("%s\n", chaine[i]);
             }
             printf ("Fin repertoire %s\n", directory);
     
             for (i = 0; i < n; i++)
             {
                free (chaine[i]), chaine[i]=NULL;
             }
          }
     
       }
    }
    Merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Salut
    Tu as qsort() qui fait déjà ça alors pourquoi t'embêter ?

    Exemple (tapé en live donc peut-être qq erreurs à la compil)

    Code c : 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
    int main()
    {
        char *tabFic[]={
            "Z26571_TING_180112_0956.txt",
            "Z26567_TING_130112_1017.txt",
            "Z26566_TING_210212_1024.txt",
            "Z26565_TING_230212_0958.txt",
            "Z26565_TING_060212_0954.txt",
            "Z26565_TING_060112_0958.txt",
            "Z26564_TING_030212_0941.txt",
            "Z26529_TING_200212_1001.txt",
        };
     
        int i;
     
        printf("Tableau origine\n":)
        for (i=0; i < 8; i++)
            printf("fichier[%d]=%s\n", i, tabFic[i]);
     
        qsort(tabFic, 8, sizeof(char*), strcmp);
     
        printf("Tableau trié\n":)
        for (i=0; i < 8; i++)
            printf("fichier[%d]=%s\n", i, tabFic[i]);
    }

    Bon, cet exemple trie le tableau par ordre alphabétique car c'est ce que fait strcmp(). Toi tu veux un tri sur la date inscrite dans le nom donc il te faut d'abord écrire une fonction prenant en paramètre 2 noms et renvoyant
    • -1 si nom1 < nom2 selon ton critère
    • 0 si nom1=nom2 selon ton critère
    • 1 si nom1 > nom2 selon ton critère

    Puis tu lis ton dossier, tu remplis ton tableau de noms, tu appelles qsort() en lui passant en dernier paramètre le pointeur sur ta fonction. qsort l'utilisera pour comparer les différents noms et se chargera de tout ce qui est déplacement et hop, tu te retrouves avec ton tableau trié comme tu le veux...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Le soucis c'est que je ne pourrais pas rentrer les noms de fichiers à la main dans le tableau , il faudrais que je puisse les lister et les stocker dans tabFic[]
    car d'autre fichier viendron s'ajouter dans ce dossier , je ne sait pas si j'ai bien expliqué mon probleme mais en gros, à chaque compilation il faudra lister les fichiers du dossier , ensuiste effectuer le trie, et enfin copier le contenu de chaque fichier dans un nouveau fichier en fonction de sa référence et de la date.

    C'est pour cela que j'ai crée une fonction pour lister le contenu avant de traiter les données.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par halloumiali Voir le message
    Le soucis c'est que je ne pourrais pas rentrer les noms de fichiers à la main dans le tableau , il faudrais que je puisse les lister et les stocker dans tabFic[]
    car d'autre fichier viendron s'ajouter dans ce dossier , je ne sait pas si j'ai bien expliqué mon probleme mais en gros, à chaque compilation il faudra lister les fichiers du dossier , ensuiste effectuer le trie, et enfin copier le contenu de chaque fichier dans un nouveau fichier en fonction de sa référence et de la date.

    C'est pour cela que j'ai crée une fonction pour lister le contenu avant de traiter les données.
    Mon exemple t'explique comment fonctionne qsort et utilise un tableau figé mais rien n'interdit d'utiliser un tableau dynamique. On s'en fout qu'il ait été rempli à la main ou par lecture du dossier, l'important c'est qu'il soit rempli pour le passer à qsort !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Ok , mais avant , pour pouvoir trier , il faut dabord que je puisse parcour mon tableau chaine[i] de ma fonction listerFichier() afin de pouvoir faire mon trie.
    Mais voila , je n'arrive pas à récupérer mon tableau.
    Comment puis-je rendre chaine[i]accessible depuis le main et partout dans le programme pour qu'ensuite je puisse effectuer d'autre opérations sur ce tableau qui contient mes noms de fichier ?

    Doit-je créer une variable chaine[i] global ?? car je ne voit pas d'autre moyen.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    void listerFichier => char** listerFichier
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Tu peux presque toujours te passer de variables globales. Comme dit par Bousk, il faut renvoyer un pointeur vers ton tableau

    Dans ce cas, il ne faudra pas que ton tableau soit déclaré de manière automatique mais avec une allocation dynamique.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    Points : 15
    Points
    15
    Par défaut
    Voici ma fonction de trie qui utilise strcmp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void tri_iteratif(char *tableau[], int taille)
    {
    char *temp;
    int i, j;
     
    for (i = 0; i < taille; i++)
        for (j = 0; j < taille; j++)
          if (strcmp(tableau[i], tableau[j]) < 0)
            {
              temp = tableau[i];
              tableau[i] = tableau[j];
              tableau[j] = temp;
            }
      }
    et voici l'appel de ma fonction dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tri_iteratif(chaine, i);
       for (j = 0; j < i; j++)
         printf("%d  trie :  %s \n",j, chaine[j]);
    Ca me trie effectivement le contenu de mon dossier dans l'ordre alphabétique.

    Mais j'aurais voulu prendre en compte tout les parametres indiqué dans le nom du fichier :

    Trier par référence et chronologiquement en fonction de la date et de l'heure.

    Comment pourait-je procéder ?
    Y-a-t'il une fonction qui me permette , par exemple de lire un à un les charactère du nom de fichier et de les comparer ?

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il n'y a de solution toute faite : ça serait trop beau de dire à une fonction magique "je veux trier selon l'ordre alphabétique des 5 premiers caractères et en cas d'égalité par la date contenue dans les 8 caractères suivants" !

    Il faut que tu remplaces strcmp(tableau[i], tableau[j]) par ta_fonction_de_tri(tableau[i], tableau[j]) (comme l'a dit Sve@r dans son premier post). ta_fonction_de_tri est à réaliser toi-même comme son nom l'indique. A première vue, en souhaitant par exemple comparer ces deux lignes :
    Z26571_TING_180112_0956.txt
    Z26567_TING_130112_1017.txt
    , tu devras :
    • faire un strncmp jusqu'au second underscore
    • si l'égalité demeure, extraire les 6 caractères suivants constituant la date
    • comparer les dates
    • si l'égalité demeure, comparer les derniers caractères avec un strnmp partant du dernier underscore et allant jusqu'au point


    Tu n'auras à priori pas besoin de comparer caractère par caractère (sauf pour la comparaison des dates, mais ça dépend du format de la date. En fait, strcmp (et strncmp) sont des fonctions pour comparer 2 chaînes caractère par caractère. Tu peux regarder le code de ces fonctions pour comprendre comment elles marchent.

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par halloumiali Voir le message
    Voici ma fonction de trie qui utilise strcmp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void tri_iteratif(char *tableau[], int taille)
    {
    char *temp;
    int i, j;
     
    for (i = 0; i < taille; i++)
        for (j = 0; j < taille; j++)
          if (strcmp(tableau[i], tableau[j]) < 0)
            {
              temp = tableau[i];
              tableau[i] = tableau[j];
              tableau[j] = temp;
            }
      }
    Mouais. Bref tu as réécrit (mais en moins bien) la fonction qsort...

    Citation Envoyé par halloumiali Voir le message
    Ca me trie effectivement le contenu de mon dossier dans l'ordre alphabétique.

    Mais j'aurais voulu prendre en compte tout les parametres indiqué dans le nom du fichier :

    Trier par référence et chronologiquement en fonction de la date et de l'heure.

    Comment pourait-je procéder ?
    Y-a-t'il une fonction qui me permette , par exemple de lire un à un les charactère du nom de fichier et de les comparer ?
    Ce n'est pas en reposant 3 fois la même question que tu auras des réponses différentes (ou qui te plaisent mieux !!!)
    Je t'ai dit comment faire. bktero te le dit aussi d'une façon différente. Donc soit tu fais comme on t'a dit, soit tu ne le fais pas. Mais quoi qu'il en soit, même si tu reposes la question une 4° fois, la réponse ne changera pas...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/04/2014, 16h22
  2. [AC-2007] Requête tri en fonction date et nom
    Par Lyysis dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 15/05/2013, 13h01
  3. Affichage image en fonction du nom de fichier
    Par fuema7 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/04/2010, 13h21
  4. Tri avec fonction de comparaison personnalisée (Python 3)
    Par MorganStern dans le forum Général Python
    Réponses: 4
    Dernier message: 28/01/2010, 12h22
  5. Variable en fonction du nom de fichier
    Par nicolasf85 dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/10/2009, 09h50

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