Bonjour tout le monde,

Voilà je viens vers vous car j'ai besoin de votre aide s'il vous plaît pour régler un petit problème de modification d'une structure dans un fichier séquentiel physique.

J'ai une structure "fournisseur" composée de 3 champs {idFournisseur, nomFournisseur, villeFournisseur}
Lorsque j'introduis mes enregistrements et que je les liste cela fonctionne et j'obtiens bien:

id nom lieu
14 aldi ans
15 aldo ans
Je constate donc:
Un enregistrement me prend donc 96 octets.
Taille du fichier 192 octets
Donc pour ceci c'est ok l'encodage s’effectue bien.

Modification du premier enregistrement
Lorsque je veux modifier le premier enregistrement c'est à dire le champs "fournisseur" et passer de aldi à aldu pour le id 14 cela fonctionne et l'affichage me donnera donc ceci:
id nom lieu
14 aldu ans
15 aldo ans
Je constate donc:
Un enregistrement me prend donc 96 octets.
Taille du fichier 192 octets
Dans ce cas ci c'est bon aussi :-)


Modification d'un enregistrement après le premier
Lorsque je veux modifier un enregistrement après le premier enregistrement par exemple aldo que je veux changer en alda pour le id 15 , l'affichage n'a plus rien de cohérent !

id nom lieu
14 aldu ans
15624 *!ezz
Dans ce cas ci cela ne fonctionne pas :-(
je constate donc:
La taille du fichier est de 193 octets !!
Je me retrouve donc avec 1 octet en plus et lors de l'affichage on dirais qu'il va me chercher des valeurs là ou il ne doit pas.


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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
 
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
 
struct fournisseur
{
    long idFournisseur;
    char nomFournisseur[50];
    char villeFournisseur[40];
};
 
int fct_menu_fichier();
//bloc fonction fichier fournisseur
int fct_menu_fournisseur();
int fct_menu_update_fournisseur();
void  encodage_fournisseur  (struct fournisseur *);
void affichestructure(struct fournisseur *);
//FILE * f_open_File(const char *);
FILE * f_open_File(const char *nom,const char *mode);
void recherche(struct fournisseur *,char*pfournisseur);
//int recherche(struct fournisseur *pvec,char*pfournisseur);
void  fct_update(struct fournisseur *pvec,char*pfournisseur);
//----------------------------------------------------------------------
int main()
{
    FILE *fp; //pointeur de fichier
    int menu;
    //bloc file fournisseur
    char NomModif[50];
 
    struct fournisseur pvec;
 
    do
    {
        system("cls");
        switch(menu= fct_menu_fichier())
        {
        case 1:
            do
            {
 
                switch (menu= fct_menu_fournisseur())
                {
                case 1:
                    system("cls");
                    printf("encodage d'un nouveau fournisseur\n");
                    printf("-----------------------------------------\n");
                    fp= f_open_File("fournisseur.txt","ab");//ouverture du fichier en lecture et ecriture
                    encodage_fournisseur (&pvec);
                    fwrite(&pvec,sizeof(struct fournisseur),1,fp);//ecrire dans fichier
                    fclose(fp);
                    break;
                case 2:
                    system("cls");
                    printf("Modification fiche fournisseur\n");
                    printf("entre le nom du fournisseur dont vous souhaitez faire la modification: \n");
                    fflush(stdin);
                    gets(NomModif);
                    fct_update(&pvec,NomModif);
                    break;
                case 3:
                    system("cls");
                    printf("--------------liste des fournisseurs------------------\n");
 
                      fp= f_open_File("fournisseur.txt","rb");//ouvre le fichier en écriture
                     // fseek(fp,0,0) ;//placement debut fichier
                       while(fread(&pvec,sizeof(struct fournisseur),1,fp)!=0)
                        {
                            affichestructure (&pvec);
                        }
 
                        fclose(fp);//ferme  le fichier
                    break;
                case 4:
                    system("cls");
                    menu= fct_menu_fichier();
                    break;
                }
 
            }while(menu!=4);
 
            break;//case 1 du menu principal
        }
 
    }while(menu!=4);
 
    return 0;
}
//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_fichier(void)
{
    int choix;
    printf("----------------Menu Principal-------------------\n\n");
    printf("Sur quel fichier souhaitez_vous travailler?\n");
    printf("-----------------------------------------------\n");
    printf("1 fournisseur\n2 produit\n3 achat\n4 sortir du programme\n");
    printf("Entre le numero de l'operation a effecteur: \n");
    fflush(stdin);
    scanf("%d",&choix);
    return choix;
}
//I :
//P : Creation du  menu specifique au fichier fournisseur ,demande d'entrer l'action que veut effectuer l'utilisateur
//O : Le choix menu de l'utilisateur
int fct_menu_fournisseur(void)
{
    int choix;
    printf("----------------Menu Fournisseur-------------------\n\n");
    printf("Ques souhaitez-vous faire?\n");
    printf("1 A jouter fournisseur\n2 modifier fiche fournisseur\n3 afficher liste fournisseur\n4 retourner au menu principal\n\n");
    printf("Entre le numero de l'operation a effecteur: \n");
    fflush(stdin);
    scanf("%d",&choix);
    return choix;
}
 
//I :Prend le pointeur de structure en paramètre
//P : va encoder les données spécifique au fournisseur entré par l'utilisateur
//O :
void encodage_fournisseur (struct fournisseur *pvec)
{
     //FILE *fp;
    // fp= f_open_File("rb");
       int ret=0;
       do
       {
           printf("entre l'id fournisseur: ");
           fflush(stdin);
           ret= scanf("%ld",&(pvec->idFournisseur));
           //test si id n'est pas plus petit que 13 chiffres
         /*  if(pvec->idFournisseur<=12)
           {
                ret=0;
           }
           //test si id existe deja
          while(fread(pvec,sizeof(struct fournisseur),1,fp)!=0&&((strcmp(pvec->idFournisseur,pvec->idFournisseur)<0)||(strcmp(pvec->idFournisseur,pvec->idFournisseur)>0)))
          {
 
          }
           if(strcmp(pvec->idFournisseur,pvec->idFournisseur)==0)
           {
               printf("id deja existant\n");
               fclose(fp);
               ret=0;
           }
           else
           {
               ret=1;
           }*/
       }while(ret!=1);//faire en sorte que l'id ne se repete pas
 
        printf("entre nom du fournisseur: ");
        fflush(stdin);
        gets(pvec->nomFournisseur);
 
        printf("entre la situation géographique(ville)/n: ");
        fflush(stdin);
        gets(pvec->villeFournisseur);
}
//I:prend le pointeur de structure en paramètre
//P:va afficher les données de chaque structure contenues dans le fichier
//O:
void affichestructure(struct fournisseur *pvec)
{
        printf("----------------------------------------------------\n\n");
        printf("ID\t\tFournisseur\tVille\n");
        printf("-----------------------------------------------------\n\n");
        printf("%ld\t",pvec->idFournisseur);
        printf("%s\t\t ",pvec->nomFournisseur);
        printf("%s\t\n\n",pvec->villeFournisseur);
}
//I: prend le mode d'ouverture du fichier en paramètre
//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(const 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("fournisseur.txt","wb");
        fclose(fp);//ferme le fichier
        fp=fopen(nom,mode);//reouverture dans le mode choisi par user
    }
    return fp;
}
//I:prend le pointeurde fichier et la saisie de l'utilisateur necessaire a la recherche  en paramètre
//P:va rechercher le nom du fournisseur saisi si il le trouve il il affiche les données
//O:
void recherche(struct fournisseur *pvec,char*pfournisseur)
{
    FILE *fp;
    fp= f_open_File("fournisseur.txt","rb");
 
    while(fread(pvec,sizeof(struct fournisseur),1,fp)!=0&&((strcmp(pfournisseur,pvec->nomFournisseur)<0)||(strcmp(pfournisseur,pvec->nomFournisseur)>0)))
    {
 
    }
     if((strcmp(pfournisseur,pvec->nomFournisseur)==0))
    {
           /* printf("**********************************************\n\n");
            printf("id: %ld\tnom: %s\tville: %s\n",pvec->idFournisseur,pvec->nomFournisseur,pvec->villeFournisseur);
            printf("***********************************************\n\n");*/
    }
    else
    {
        /* printf("**********************************************\n\n");
         printf("Fournisseur inexistant\n");
         printf("**********************************************\n\n");*/
    }
     fclose(fp);
}
//I :Prend le pointeur de structure et la saisie de l'utilisateur en paramètre
//P : effectue une compraison de la saisie avec les données dans le fichier si saisie existe il demande d'effectuer la modification si non il demande si l'on veut creer le fournisseur
        // dans les deux cas si choix est Non retour au menu du fichier cible
//O :
void  fct_update(struct fournisseur *pvec,char*pfournisseur)
{
    char choix;
    int cpt=0;
 
    FILE *fp;
    fp= f_open_File("fournisseur.txt","rb+");//lecture et ecriture
 
    while(fread(pvec,sizeof(struct fournisseur),1,fp)!=0&&((strcmp(pfournisseur,pvec->nomFournisseur)<0)||(strcmp(pfournisseur,pvec->nomFournisseur)>0)))
    {
        cpt++;
       // printf("cpt=%d\n",cpt);
    }
 
    if(strcmp(pfournisseur,pvec->nomFournisseur)==0)
    {
         printf("id: %ld\tnom: %s\tville: %s\n",pvec->idFournisseur,pvec->nomFournisseur,pvec->villeFournisseur);
 
         printf("voulez-vous  vraiment modifier la fiche fournisseur? O/N\n");
         fflush(stdin);
         scanf("%c",&choix);
         if(choix=='O'||choix=='o')
        {
             printf("modification de la fiche fournisseur\n");
 
             fseek(fp,cpt,0);//probleme de modification pour ce qui est la suite du premier
            // fseek(fp,(sizeof(long)+50+40)*(cpt),SEEK_CUR);//cpt-1 mais ne fonction pas du tout si je place la struct fournisseur en parametre cela ne fonctionne pas
           // fseek(fp,sizeof(struct fournisseur)*(cpt-1),SEEK_CUR);//ici l'id ne s'affiche pas correctement les autres oui mais a la fin du fichier//le premier s'écrase mais pas bon id
            fseek(fp,sizeof(struct fournisseur)*(cpt),SEEK_CUR);//idem que le precedent sauf que j'ai caract bizzare en plus
 
             encodage_fournisseur (pvec);
             fwrite(pvec,sizeof(struct fournisseur),1,fp);//ecrire dans fichier
             fclose(fp);
 
        }
        else
        {
            printf("Annulation de la modification de la fiche fournisseur\n");
            fclose(fp);
        }
     }
    else
    {
        printf("Impossible de le modifier Fournisseur inexistant\n\n");
        printf("Souhaitez-vous le creer? O/N\n");
        fflush(stdin);
        scanf("%c",&choix);
        if(choix=='O'||choix=='o')
        {
            printf("Création du fournisseur\n");
            fp= f_open_File("fournisseur.txt","ab");//ouverture du fichier en lecture et ecriture
            encodage_fournisseur (pvec);
            fwrite(pvec,sizeof(struct fournisseur),1,fp);//ecrire dans fichier
            fclose(fp);
        }
        else
        {
            printf("retour menu\n");
            fclose(fp);
        }
    }
}
Je ne comprend pas pourquoi et ou est-ce que j'ai fauté :-(
Je vous remercie d'avance,
Bien à vous.