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 :

Tri fichier en utilisant arbre


Sujet :

C

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Tri fichier en utilisant arbre
    salut tt le monde bon je veux développer un prog qui fait un tri d'un fichier déjà rempli selon un critère choisis comme essai j'ai rempli un fichier par des ligne contient cin[8]nom[20]date[4]

    et j'ai essayé de faire le tri selon le cin le clé de l'arbre contient une ligne puis il compare les 8 premier caractères et saisie le clé dans un autre fichier temporaire

    mais cette fonction ne fait rien , s'il vous plait aidez moi a connaitre ou est le prob
    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
     
     
    char ch[36],cin[8],ch1[28];
     f= fopen("arbre.txt", "w");
     fichier= fopen("testarbre.txt", "r");
     while (!feof(fichier))
     
       {
          fscanf(fichier, "%s", ch);
          node *tmpNode;
          node *tmpTree = *tree;
          node *elem =(node*)malloc(sizeof(node));
          elem->(*ligne)=(* ch);
          elem->left = NULL;
          elem->right = NULL;
     
          if(tmpTree)
           do
           {
            tmpNode = tmpTree;
            sscanf(ch,"%s %s",cin,ch1);
            if(strcmp(cin,tmpTree->ligne) > 0 )
             {
                tmpTree = tmpTree->right;
                if(!tmpTree) tmpNode->right = elem;
                fprintf(f,"%s\n",tmpTree->ligne);
             }
            else
             {
                tmpTree = tmpTree->left;
                if(!tmpTree) tmpNode->left = elem;
                fprintf(f,"%s\n",tmpTree->ligne);
             }
           }
           while(tmpTree&&f);
        else  *tree = elem;
      }
      fclose(fichier);
      fclose(f);}

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 567
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 567
    Points : 7 657
    Points
    7 657
    Par défaut
    Bonjour,

    Il manque des données pour mieux comprendre (par exemple on n'a pas le type de tree ni de ligne)
    Quelques points vus :
    Ligne 9 : faire plutôt fgets( ch , sizeof ch, fichier ) car fscanf( "%s" ) ne lit qu'un seul mot.
    Ligne 13 : ne devrait pas compiler. Erreur de recopie? devrait plutôt ressembler à strcpy( elem->ligne , ch );

    Bien lire, les erreurs et warnings retourné par le compilateur.
    Utiliser le debugger, pour trouver à quel moment les choses ne fonctionnent pas.

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    ceci mon arbre
    typedef struct node
    {
    char line[35];
    struct node *left;
    struct node *right;
    } node ;

    j'ai fait quelques modifications ...
    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 addNode(node **tree, FILE* f,FILE* fichier)
    {  
    char ch[36],cin[8],ch1[28];
     f= fopen("arbre.txt", "w");//fichier tempo
     fichier= fopen("testarbre.txt", "r");//fichier intiale
     while (!feof(fichier))
     
       {
          fgets( ch , 35, fichier );
          node *tmpNode;
          node *tmpTree = *tree;
          node *elem =(node*)malloc(sizeof(node));
          strcpy(elem->line, ch);//ch est une ligne de fichier
          elem->left = NULL;
          elem->right = NULL;
     
          if(tmpTree)
           do
           {
            tmpNode = tmpTree;
            sscanf(ch,"%s %s",cin1,ch1);//extraire le cin d'une ligne de  fichier
     
           sscanf(elem->line,"%s %s",cin2,ch2);//extraire le cin de ligne stocker dans l arbre
     
            if(strcmp(ch1,ch2) > 0 )/les comparer et selon leur valeur les placé
             {
                tmpTree = tmpTree->right;
                if(!tmpTree) tmpNode->right = elem;
                fprintf(f,"%s\n",tmpTree->line);//ecrire la ligne dans un autre fichier temporaire
             }
            else
             {
                tmpTree = tmpTree->left;
                if(!tmpTree) tmpNode->left = elem;
                fprintf(f,"%s\n",tmpTree->line);
             }
           }
           while(tmpTree&&f);
        else  *tree = elem;
      }
      fclose(fichier);
      fclose(f);
    }
    je veux stocker chaque ligne(contient cin[8]nom[20]date[4]) de mon fichier initiale dans un nœud de l'arbre on comparons les cin puis on écrit la ligne dans un fichier temporaire (normalement je le trouve trié ; puis je le recopie au fichier initiale ou je le renomme )
    au début , au place de char line[] j'ai tester avec une valeur entière l'arbre marche bien elle fait le tri et les stock dans le fichier mais quand je la modifier en chaîne de caractère le code ne fait rien

  4. #4
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Je m'interroge sur le fait de recourir à un fichier temporaire pour stocker tes clefs : pourquoi ? Je doute que tu aies si peu de mémoire au point d'avoir besoin du disque pour construire ton arbre. Cela complexifie ton programme et diminue sa résilience : sa capacité à résister aux erreurs d'origine extérieure. Peux-tu revoir ton algorithme pour éviter cette séquence intermédiaire d'entrée-sortie ?

    D'autre part je me permets de te faire quelques remarques :

    • Cette fonction ne compile pas, est-ce que tu l'as déjà testée ? S'il n'y a pas une seule bonne méthodologie, il y en a de mauvaises. Voici ce que tu devrais faire afin de t'éviter bien des bugs :
      • écrire la définition d'une fonction vide, compiler, tester ;
      • ajouter l'ouverture et la fermeture de fichier, compiler, tester ;
      • ajouter la lecture du fichier ligne par ligne, compiler, tester ;
      • ajouter le traitement de chaque ligne, compiler, tester...

    • Tu n'as aucune gestion des erreurs dans ton code, si pour une raison quelconque une opération d'entrée-sortie échoue ça craque.
    • node *elem = (node*)malloc(sizeof(node)); ne caste pas la valeur de retour de malloc.
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      sscanf(ch,"%s %s",cin1,ch1);//extraire le cin d'une ligne de  fichier
       
             sscanf(elem->line,"%s %s",cin2,ch2);//extraire le cin de ligne stocker dans l arbre
      ch et elem->line contiennent la même information puisque tu viens de copier l'un dans l'autre quelques lignes avant, non ?
    • while(tmpTree && f); pourquoi cette condition ? Pourquoi tout d'un coup f deviendrait NULL ?

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    au debut en place de char line[] j'ai essaye avec une valeur entier int val l'arbre a marché bien elle stock les valeurs et fait le tri quand je la modifier en une chaine de caractere la fonction devient ne fait rien et j'ai essaye de l adapter a mes besoins ...
    ben pour le fichier temporaire vous avez raison je peux ouvrir mon fichier initiale en mode r+ et j'ecrase son contenue initiale

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ce n'est pas ce que je voulais dire :

    • génère et remplis ta structure de données en lisant ton fichier d'entrée (en mode "r") jusqu'à EOF ;
    • ferme ton fichier d'entrée ;
    • réalise d'éventuelles opérations sur ta structure de données ;
    • ouvre et écris dans ton fichier de sortie (en mode "w") ;
    • ferme ton fichier de sortie.

    Utilise un fichier de sortie différent du fichier d'entrée, c'est plus propre et une bonne pratique à prendre. Récupère tes noms de fichier depuis les arguments de ligne de commande, ainsi si l'utilisateur désire spécifier le même fichier en entrée et en sortie il est libre de le faire et c'est sa responsabilité.

  7. #7
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    c'est bon merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB.Net][Fichier ini] utilisation des API
    Par DonF dans le forum Windows Forms
    Réponses: 5
    Dernier message: 09/03/2009, 14h32
  2. charger d'un fichier dans un arbre
    Par rihabtrk dans le forum C
    Réponses: 2
    Dernier message: 21/05/2006, 14h14
  3. Decompression d'un fichier sans utiliser les modules du CPAN
    Par choubiroute dans le forum Modules
    Réponses: 6
    Dernier message: 10/03/2006, 14h20
  4. récupérer des nom de fichiers en utilisant *.ext
    Par drinkmilk dans le forum ASP
    Réponses: 11
    Dernier message: 15/12/2004, 09h21

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