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.