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 :

problème de chaînage dans un fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut problème de chaînage dans un fichier
    Bonjour tout le monde,

    Voilà j'aurais besoin de votre aide afin de m'éclairer sur mes erreurs de manipulation de fichier.

    Je vous expose mon cas, je dois créer un fichier produits dans lequel il sera possible d'ajouter un produit et d'afficher les produits par ordre alphabétique.
    Le code que vous allez voir n'est pour l'instant pas codé de manière à trier les données car j'aimerai d'abord comprendre le système de manière simple sans tri.

    Le fichier doit être organisée de manière séquentielle logique (chaînée).

    Dans la structure je n'ai pas de pointeur élément suivant, je dois travailler avec des pointeurs qui iront aux bons emplacements et les inscrirent dans le fichier.
    - pto (premier emplacement occupé)
    - Ptl (premier emplacement libre)
    - suiv (élément suivant)
    - prec (élément précédent )

    Mon soucis est que je pense avoir un problème dans l'ajout et le chaînage car j'arrive à encoder les éléments mais l'affichage ne fait apparaître que le dernier élément enregistré je pense que mes enregistrements s’écrasent et je ne sais pas du tout comment résoudre le problème.

    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
     
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    struct produit
    {
        char idProduit[14];
        char marque[50];
        char nomProduit[50];
        char volume[9];
        char categorie[40];
    };
    //bloc produit
    FILE * f_open_File(char *,const char *);
    int fct_menu();
    void encode(struct produit *);
    void affichestructure(struct produit *);
    int main()//ptl=ftell(fp);
    {
        struct produit prod;
        char name_File[50];
       // char mode_File[20];
        int pto=-1,ptl=-1,suiv=-1,nouv_ptl=-1,prec=-1;
        int menu,i;
        FILE *fp;//necessaire pour creer et ecrire dans le fichier
        printf("entre le nom du fichier: \n");
        fflush(stdin);
        gets(name_File);
        strcat(name_File,".txt");//concatenation du nom et de l'extension du fichier
        fp= f_open_File(name_File,"rb+");
     
        if(fp==NULL)
        {
            fp= f_open_File(name_File,"wb");
            fclose(fp);
            fp= f_open_File(name_File,"ab");
            fwrite(&pto,sizeof (int),1,fp);
            fwrite(&ptl,sizeof (int),1,fp);
             //prealoc struct produit dans le code finale l'espace de prealoc doit etre de 1000
             for(i=0;i<4;i++)
             {
                 fwrite(&prod,sizeof(struct produit),1,fp);
                 fwrite(&pto,sizeof(int),1,fp);
             }
               fclose(fp);
     
        }
        //ligne de test si mes  virables recoivent la bonne valeur
        //cette ligne sera supprimer dans le code final
        printf(" pto1 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
        printf("taille stuct %d\n",sizeof(struct produit));
        do
        {
            switch(menu= fct_menu())
            {
            case 1:
               // system("cls");//vide l'écran
                printf("new produit\n");
                encode(&prod);
                fp= f_open_File(name_File,"rb+");//ouverture du fichier en lecture et ecriture
                 //ligne de test si mes  virables recoivent la bonne valeur
                //cette ligne sera supprimer dans le code final
                printf(" pto2 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
                fread(&pto,sizeof(int),1,fp);
     
                if(pto==-1)
                {
                    //test de valeur sera effacer dans le code final
                     printf("pto=-1\n");
                   // fseek(fp,4,0);
                    fread(&ptl,sizeof(int),1,fp);//je lis dans le fichier jusqu'a la taille de fin de ptl
                   // fseek(fp,ptl,0);//je me deplace  de 8 octet a parti du debut du fichier  (jusqu'a la taille de fin de ptl)
     
                    ptl=ftell(fp);
                      //ligne de test si mes  virables recoivent la bonne valeur
                    //cette ligne sera supprimer dans le code final
                    printf(" pto3 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
                    fwrite(&prod,sizeof(struct produit),1,fp);//ecriture de la structure produit dans fichier
                    fwrite(&suiv,sizeof (int),1,fp);//j'ecris l'emplacement du suivant(-1)
                    nouv_ptl=ftell(fp);//prend la nouvelle taille du fichier
                    fseek(fp,0,0);//je retourne au debut du fichier
     
                    pto= ptl;
                     //j'ecris la valeur de ptl dans pto->8
                    fwrite(&pto,sizeof (int),1,fp);
                    ptl=nouv_ptl;
                    fwrite(&nouv_ptl,sizeof (int),1,fp);//j'ecris la nouvelle valeur de ptl
                    fseek(fp,0,SEEK_END);//je me place a la fin du fichier
                    fclose(fp);
                    fp= f_open_File(name_File,"rb+");//ouvre le fichier en lecture /ecriture
                     //ligne de test si mes  virables recoivent la bonne valeur
                    //cette ligne sera supprimer dans le code final
                    printf(" pto4 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
                    fclose(fp);
                 }
                 else
                 {
                     //probleme de valeur ptl-pto
                     if(pto!=-1)
                     {
                         printf("coucou\n");
                         pto=pto;//pto a tjs la meme valeur il pointe sur le premier element de la liste il devra changer lors d'un tri par ordre alphabetique
                         fwrite(&pto,sizeof (int),1,fp);//j'ecris la  valeur de pto
     
                        //ici la boucle n'a pas d'utilité le programme execute de manière identique avec ou sans
                        //normalement le but etait de parcourir le fichier jusqu'au moment ou je trouve une place libre qui est reférencer par -1
                       /* do//lis en continu car sui est tjs !=-1
                        {
                           // fread(&suiv,sizeof(int),1,fp);
     
                        }while(suiv!=-1);*/
     
                        //dans ce bloc Pto change de valeur au 3iem enregristrements alors qu'il doit tjs avoir la meme valeur et les autres variable prennent toutes la meme valeur
                        if(suiv==-1)
                        {
                             prec=ptl;
                             fwrite(&prec,sizeof (int),1,fp);
                             //ligne de test si mes  virables recoivent la bonne valeur
                            //cette ligne sera supprimer dans le code final
                             printf(" pto5 %d  ptl %d nouv ptl %d suiv %d,prec %d\n",pto,ptl,nouv_ptl,suiv,prec);
                             fwrite(&prod,sizeof(struct produit),1,fp);//ecriture de la structure produit dans fichier
                             suiv=-1;
                             fwrite(&suiv,sizeof (int),1,fp);//j'ecris l'emplacement du suivant(-1)
                             nouv_ptl=ftell(fp);//pren la taille du fichier
                             fseek(fp,0,0);//je retourne au debut du fichier
                             ptl=nouv_ptl;
                             fwrite(&nouv_ptl,sizeof (int),1,fp);//j'ecris la nouvelle valeur de ptl
                             fseek(fp,0,SEEK_END);
                             fclose(fp);
                             fp= f_open_File(name_File,"rb+");//ouvre le fichier en lecture /ecriture
                             //ligne de test si mes  variables recoivent la bonne valeur
                            //cette ligne sera supprimer dans le code final
                             printf(" pto6 %d  ptl %d nouv ptl %d suiv %d prec %d\n",pto,ptl,nouv_ptl,suiv,prec);
                             fclose(fp);
                        }
     
                     }
     
                 }
               break;
     
            case 2:
              //  system("cls");//vide l'écran
                printf("affiche produit\n");
                printf("----------------\n\n");
                fp= f_open_File("produit.txt","rb");//ouvre le fichier en lectrure
                fseek(fp,pto,0);//place toi au debut du fichier
               do
               {
                  fread(&pto,sizeof(int),1,fp);//lis a partir de pto
                  fseek(fp,pto,SEEK_CUR);
                  fread(&suiv,sizeof(int),1,fp);//lis a partir de suiv
     
                  printf(" pto1 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
                 // fread(&prod,sizeof(struct produit),1,fp);
                         affichestructure(&prod);
     
                 // fwrite(&prod,sizeof(struct produit),1,fp);//ecriture de la structure produit dans fichier
                //  fwrite(&suiv,sizeof (int),1,fp);//j'ecris l'emplacement du suivant(-1)
     
               }while(suiv!=-1);
                fclose(fp);//ferme  le fichier printf(" pto1 %d  ptl %d nouv ptl %d apres_struct %d\n",pto,ptl,nouv_ptl,suiv);
                break;
            }
     
        }while(menu!=0);
     
        return 0;
    }
    //declaration fonctions
    //I:prend le nom du fichier et le mode d'ouverture
    //P:ouvre  le fichier selon le choix du user et le creer s'il n'existe pas
    //O:retourne le pointeur de fichier
    FILE * f_open_File(char *nom,const char *mode)
    {
     
         FILE *fp;
     
         fp=fopen(nom,mode);
     
         //si fichier n'existe pas creer et ouvre selon le choix du user
       /*  if(fp==NULL)
        {
     
            fp= fopen(nom,"wb");
            fclose(fp);//ferme le fichier
            fp=fopen(nom,mode);//reouverture dans le mode choisi par user
        }*/
        return fp;
    }
    //I :
    //P : Creation du  menu ,demande d'entrer l'action que veut effectuer l'utilisateur
    //O : Le choix menu de l'utilisateur
    int fct_menu(void)
    {
     
        int choix;
        printf("que voulez-vous faire?\n");
        printf("1 Ajouter un produit\n2 Affiche produit\n0 Quitter l'application\n");
        printf("Entre le numero de l'operation a effecteur: \n");
        fflush(stdin);
        scanf("%d",&choix);
     
        return choix;
     
    }
    //fonction encodage
    //I :
    //P :encode les differents element de la stucture acheter
    //O :
    void encode(struct produit *prod)
    {
       printf("entre le code barre  du produit: \n");
        fflush(stdin);
        gets(prod->idProduit);
     
        printf("entre la marque du produit: \n");
        fflush(stdin);
        gets(prod->marque);
     
        printf("entre le nom du produit:  \n");
        fflush(stdin);
        gets(prod->nomProduit);
     
        printf("entre le volume du produit:  \n");
        fflush(stdin);
        gets(prod->volume);
     
        printf("entre la categorie du produit:  \n");
        fflush(stdin);
        gets(prod->categorie);
     
    }
    void affichestructure(struct produit *pProd)
    {
     
                printf("IdProduit\tMarque\t\tnomProduit\t\tvolume\t\tcategorie \n");
                printf("--------------------------------------------------------------------------------\n");
                printf("* %s\t\t",pProd->idProduit);
                printf("* %s\t\t",pProd->marque);
                printf("* %s\t\t",pProd->nomProduit);
                printf("* %s\t\t",pProd->volume);
                printf("* %s\t",pProd->categorie);
     
                printf("--------------------------------------------------------------------------------\n");
    }
    Pourriez-vous me venir en aide svp ?
    Je vous remercie.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Veux-tu absolument travailler dans le fichier? C'est très long, couteux, et un fichier ne permet pas l'insertion ou la suppression de contenu au milieu.

    Même un bloc note ne fonctionne pas ainsi.

    Commence par faire de petites fonctions, telle qu'une dédiée à lire un bloc, une autre pour l'écrire, etc.

    Puisque tu sembles avoir des problèmes avec la manipulation du fichier, simplifie le reste de ton problème, par exemple en travaillant avec des blocs composés d'une seule lettre.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    merci d'avoir pris la peine de lire et répondre à mon message .
    Pour répondre à ta question Oui je suis obligé de passer par un fichier car celui-ci est spécifié dans la demande de mon exercice.
    le projet final aura pour but la gestion de stock chez un particulier.
    Effectivement j'ai beaucoup de mal avec l’accès aux fichiers mais je n'ai pas vraiment le choix.
    et c'est bien la le soucis je m'embrouille avec tout ça du coup je suis un peu perdue.

    Merci et bonne journée

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    Vu ton code, tu as un format de fichier binaire bien précis.
    Pourrais-tu nous l'indiquer?
    Ca nous aiderait à comprendre ton code.

    J'ajoute que si c'est un exercice, c'est que tu as un professeur, qui connait bien son exercice et la solution qu'il attend. N'hésite pas à lui poser des questions.
    Par contre, je trouve cet exercice malsain, puisqu'il s'agit d'apprendre à manipuler un fichier brutalement, ce qu'il ne faut (quasiment) jamais faire.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    alors oui j'ai bien un professeur c’était un exercice que je devais réaliser pour la fin de l'année que je n'ai pas réussi et je le reprend pour continuer à avancer dans mon apprentissage pour pouvoir repasser mon examen.

    L’énoncé est celui-ci: Organisation physique des fichiers

    produits:
    organisation séquentielle logique (chaînée) le chaînage permettra de suivre les produits triés par ordre alphabétique sur la catégorie,la marque,puis le nom.

    Il y aura la possibilité d'ajouter un nouveau produit et d'afficher les produits par ordre alphabétique croissant.

    Voilà tout ce que j'ai comme information pour ce fichier

    bien à vous

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    C'est tout? Alors rien ne dit qu'il faut travailler dans le fichier.

    En ce cas, lis le fichier dans une liste chainée normale, puis trie la, et enfin réécrit le fichier avec le contenu de la liste.

    Tu peux facilement faire une liste chainée avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct chainon_produit {
        struct produit produit;
        struct chainon_produit *precedent;
        struct chainon_produit *suivant;
    };
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    merci pour ta réponse mais la structure de base est celle que j'ai noté et il est bien spécifié que les structures fournies ne peuvent pas être modifiées donc ajouter suiv et précédent dans la structure je ne peux pas!
    c'est pour ça que je suis partie sur le travail dans le fichier même. Il est évident que ta méthode me correspond mieux et est plus facile à la mise ne place. Mais bon j'ai pas vraiment,t le choix dans ce cas ci.

    Merci d'avoir pris le temps de me répondre et je continue à me creuser les méninges

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2017
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    En faite, pourriez-vous m'indiquer comment procéder pour travailler en directe dans le fichier? est-ce que j'ai pris le bon chemin ou je dois tout revoir??

    Bien à vous.

Discussions similaires

  1. Problème retour chariot dans un fichier texte
    Par Redondo dans le forum Windows
    Réponses: 2
    Dernier message: 08/02/2006, 19h23
  2. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 01h13
  3. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 14h15
  4. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 03h28
  5. Réponses: 2
    Dernier message: 01/06/2004, 13h47

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