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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    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 actif
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    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 actif
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 33
    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 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    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.

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