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 éléments dans un fichier


Sujet :

C

Vue hybride

Florian.L trier éléments dans un fichier 20/04/2007, 11h36
Shugo78 Switch avec une lecture du... 20/04/2007, 11h57
souviron34 tu devras utiliser fgets pour... 20/04/2007, 11h58
Florian.L j'utilise la fonction... 21/04/2007, 00h41
Emmanuel Delahaye Horrible, aucun contrôle des... 21/04/2007, 00h56
Florian.L par quel moyen je peux... 21/04/2007, 21h51
souviron34 8O 8O 8O 8O Ah bon ?? Et... 22/04/2007, 00h46
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 93
    Par défaut trier éléments dans un fichier
    bonjour à vous,

    j'ai besoin d'une petite aide sur une procédure.

    je voudrais trier les éléments présents dans un fichier.

    > le fichier est en mode texte, chaque ligne contient un enregistrement (une structure)
    > la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct{
    	char nom[260], prenom[260];
    	int taille;
    } t_element;
    > le début de la procédure
    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
    void trier(const char* file) {
       FILE *p_fichier = fopen(file,"r");
       if (p_fichier == NULL) {printf("Erreur! Le fichier n'existe pas!\n"); return;}
     
       int choix:
       printf("Veuillez choisir le critére: \n");
       printf("1. Tri croissant par nom.\n");
       printf("2. Tri décroissant par nom.\n");
       printf("3. Tri croissant par prénom.\n");
       printf("4. Tri décroissant par prénom.\n");
       printf("5. Tri croissant par taille.\n");
       printf("6. Tri décroissant par taille.\n");
       scanf("%d", &choix);
     
     
       return;
    }
    J'avais pour idée de récuperer toutes les données du fichier, les mettre dans le tableau, trier ce tableau et réécrire ce tableau trié sur un fichier.

    mais je voit pas comment récuperer les données du fichier...dans le tableau

  2. #2
    Membre éprouvé
    Avatar de Shugo78
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 119
    Par défaut Switch avec une lecture du fichier
    Hello
    Voila ce que je te propose :
    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
     
    #define TAILLE_MAX 260 //on définit la taille maximum du tableau
    /*au début ne pas oublier les : #include <stdlib.h>
                                              #include <stdio.h>
    au début de ton programme !!*/
    ordreCroissant(void * pnom);/*le prototype que tu peut maître dans un fichier en tête !!*/
    ordreDecroissant(void * prenom);//même chose
    void *pnom=&nom;
    //ton code avec ton menu
    switch (choix)
    {
    case 1:
     pnom
      fgets(nom, TAILLE_MAX, file); /*On lit maximum TAILLE_MAX caractères du fichier, on stocke le tout dans le tableau "nom"*/
    //ensuite tu n'as qu'a faire une boucle en comptant le nombre de lignes 
            ordreCroissant(void * pnom);
            fclose(file);
    case 2:
    /*même chose puis tu fait un appel a une fonction qui trie les noms par ordres décroissant que tu nomme par exemple orderDecroissant qui prend en arguments un pointeur sur le tableau nom*/
    Ensuite tu élabore une fonction pour trier par ordre croissant et décroissant les noms les prénoms.Et comme dans ces fonctions tu seras amené a utiliser des fonctions de chaine de caractére pense a inclure <string.h>
    Bonne chance
    Bye

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu devras utiliser fgets pour lire des lignes et sscanf ou strtok pour lire les chaînes dans la ligne.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 93
    Par défaut
    j'utilise la fonction suivante pour lire dans un fichier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t_element lire_element (FILE *p_file) {
       t_element data;
       fscanf(p_file, "%s", data.nom);
       fscanf(p_file, "%s", data.prenom);
       fscanf(p_file, "%d", &data.taille);
       return data;
    }
    mhhh sinon j'ai pas bien compris ton code shugo

    autre chose, ya pas moyen d'utiliser qsort pour trier le tableau?

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par flolem
    j'utilise la fonction suivante pour lire dans un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    t_element lire_element (FILE *p_file) {
       t_element data;
       fscanf(p_file, "%s", data.nom);
       fscanf(p_file, "%s", data.prenom);
       fscanf(p_file, "%d", &data.taille);
       return data;
    }
    Horrible, aucun contrôle des codes retours. On ne sait pas si la lecture a réussi ou non... Comportement indéterminé.
    autre chose, ya pas moyen d'utiliser qsort pour trier le tableau?
    Il n'y a aucune raison qu'on ne puisse pas utiliser qsort() sur un tableau modifiable.

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2003
    Messages
    93
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 93
    Par défaut
    par quel moyen je peux effectuer ce que je veux faire dans ce cas là?

    En utilisant les fonctions d'allocation dynamique, je pourrais récupérer toutes les entrées du fichier sans connaitre le nombre de ligne du fichier...

    mais c'est pas super comme méthode...

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par flolem
    mais c'est pas super comme méthode...


    Ah bon ?? Et pourquoi ça ???

    C'est quasiment l'aspect le plus utilisé du langage C, justement à cause de sa souplesse.

    Il y a ici de très bons tutoriels et cours.. Plus les bouquins..

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par flolem
    par quel moyen je peux effectuer ce que je veux faire dans ce cas là?

    En utilisant les fonctions d'allocation dynamique, je pourrais récupérer toutes les entrées du fichier sans connaitre le nombre de ligne du fichier...

    mais c'est pas super comme méthode...
    Il ne faut évidemment pas allouer à chaque ligne, mais une tableau souple qui s'agrandit au fur et à mesure des besoins est une bonne solution. Par exemple en augmentant sa taille d'un facteur compris entre 1.5 et 2. Certains parlent de Nombre d'Or.... (1.61...)

Discussions similaires

  1. Compter le nombre d'éléments dans un fichier texte
    Par Olivier Regnier dans le forum Langage
    Réponses: 13
    Dernier message: 21/11/2007, 16h02
  2. [XPATH] Récupérer un élément dans un fichier XML
    Par be_tnt dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 07/06/2007, 19h49
  3. Comment ajouter un élément dans un fichier XML
    Par sorilazer dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 04/06/2007, 21h56
  4. lecture d'éléments dans mon fichier
    Par gillou4 dans le forum C
    Réponses: 9
    Dernier message: 23/10/2005, 16h19
  5. Réponses: 14
    Dernier message: 01/12/2003, 17h47

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