Bonjour tout le monde,

Je fais un petit exercice d'école dans lequel je remplis un fichier avec 10 entrées, ensuite je modifie le fichier et finalement j'ajoute une nouvelle structure dans le fichier.

La creation du fichier ainsi que sa modification se passe sans auccun problème.

Par contre, quand j'essaye d'ajouter une entrée dans le fichier et de lire le fichier sequentiellement j'ai pas le bon résultat.

Voici mon code (désolé si c'est un peu long) :
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
 
#include<stdio.h>
#include<string.h>
#define SIZE_MAX 20
 
typedef struct Record Record;
 
struct Record{
    char nom[SIZE_MAX];
    char commune[SIZE_MAX];
    int loyer;
};
 
void initFilePath(char * filePath);
void showFilePath(char * filePath);
 
void initRecord(Record * r);
void showRecord(Record * r);
 
int initFile(char * filePath);
int countRecordsInFile(char * filePath);
int showRecords(char * filePath);
int updateCommune(char * filePath, int numberOfRecords);
int appendRecord(char * filePath, Record * r);
 
int main()
{
    char * filePath[FILENAME_MAX];
    Record locataire;
    int nbRecordsBefore, nbRecordsAfter = 0;
 
    initFilePath(filePath);
    showFilePath(filePath);
 
    //initFile(filePath);
    nbRecordsBefore = countRecordsInFile(filePath);
 
    printf("Le nombre d'entrées dans le fichier = %d.\n", nbRecordsBefore);
    printf("=========================================.\n");
 
    showRecords(filePath);
 
    //updateCommune(filePath, nbRecordsBefore);
 
    initRecord(&locataire);
    showRecord(&locataire);
    printf("=========================================.\n");
 
    appendRecord(filePath, &locataire);
 
    nbRecordsAfter = countRecordsInFile(filePath);
 
    printf("Le nombre d'entrées dans le fichier = %d.\n", nbRecordsAfter);
    printf("=========================================.\n");
 
    showRecords(filePath);
 
    return 0;
}
 
void initFilePath(char * filePath){
    printf("Entrez le chemin vers le fichier : ");
    scanf("%s", filePath);
}
void showFilePath(char * filePath){
    printf("Le fichier se trouve à l'adresse '%s'.\n",filePath);
}
void initRecord(Record * r){
    printf("Entrez un nom de famille : ");
    scanf("%s", &r->nom);
 
    printf("Entrez une commune : ");
    scanf("%s", &(*r).commune);
 
    printf("Entrez un montant pour le loyer : ");
    scanf("%d", &r->loyer);
}
void showRecord(Record * r){
    printf("Nom = %s, Commune = %s, Loyer = %d.\n", r->nom, r->commune, r->loyer);
}
 
int initFile(char * filePath){
 
    FILE * f = NULL;
    Record r = {0};
    int cpt = 0;
 
    f = fopen(filePath, "wb");
 
    if(f == NULL)
    {
        return 1;
    }
 
    for(cpt; cpt < 10; cpt ++)
    {
        if(cpt == 3 || cpt == 5 || cpt == 8)
        {
            strcpy(r.nom,"SOLODOUKHIN");
            strcpy(r.commune, "BRUXELLES");
            r.loyer = 550;
            if(fwrite(&r, sizeof(struct Record), 1, f) != 1)
            {
                return 1;
            }
        }
        else
        {
            strcpy(r.nom,"GJEMAJLI");
            strcpy(r.commune, "NAMUR");
            r.loyer = 399;
            if(fwrite(&r, sizeof(struct Record), 1, f) != 1)
            {
                return 1;
            };
        }
    }
    fclose(f);
    return 0;
}
int countRecordsInFile(char * filePath){
    FILE * f = NULL;
    int cpt = 0;
    Record r;
 
    f = fopen(filePath, "rb");
 
    if(f == NULL)
    {
        return -1;
    }
 
    while(fread(&r, sizeof(struct Record), 1, f) == 1)
    {
        cpt++;
    }
    fclose(f);
    return cpt;
}
 
int showRecords(char * filePath){
    FILE * f = NULL;
    Record r = {0};
 
    f = fopen(filePath, "rb");
 
    if( f == NULL)
    {
        return -1;
    }
 
    while(fread(&r, sizeof(struct Record), 1, f) == 1)
    {
        showRecord(&r);
    }
 
    fclose(f);
    return 0;
}
 
int updateCommune(char * filePath, int numberOfRecords){
    FILE * f = NULL;
    Record r = {0};
    int cpt = 0;
 
    f = fopen(filePath, "rb+");
 
    if( f == NULL)
    {
        return -1;
    }
 
    for(cpt ; cpt < numberOfRecords; cpt++)
    {
        fseek(f, sizeof(struct Record) * cpt, SEEK_SET);
        fread(&r, sizeof(struct Record), 1, f);
 
        if(strcmp(r.commune, "NAMUR") == 0)
        {
            strcpy(r.commune, "NINOVE");
            fseek(f, sizeof(struct Record) * cpt, SEEK_SET);
            fwrite(&r, sizeof(struct Record), 1, f);
        }
    }
    fclose(f);
    return 0;
}
int appendRecord(char * filePath, Record * r)
{
    FILE * f = NULL;
    f = fopen(filePath, "ab");
 
    if( f == NULL)
    {
        return 1;
    }
 
    if(fwrite(&r, sizeof(struct Record), 1, f) != 1)
    {
        printf("Could not append to file.");
        return 1;
    }
 
    fclose(f);
    return 0;
}
et voici un log d'exécution :
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
 
/home/sviktor/CLionProjects/untitled/cmake-build-debug/untitled
Entrez le chemin vers le fichier : test5.bin
Le fichier se trouve à l'adresse 'test5.bin'.
Le nombre d'entrées dans le fichier = 10.
=========================================.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Entrez un nom de famille : NOUVELLE_FAMILLE
Entrez une commune : NOUVELLE_COM
Entrez un montant pour le loyer : 780
Nom = NOUVELLE_FAMILLE, Commune = NOUVELLE_COM, Loyer = 780.
=========================================.
Le nombre d'entrées dans le fichier = 11.
=========================================.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = SOLODOUKHIN, Commune = BRUXELLES, Loyer = 550.
Nom = GJEMAJLI, Commune = NAMUR, Loyer = 399.
Nom = `����, Commune = �, Loyer = 4196343.
 
Process finished with exit code 0
Comme vous pouvez le voir, le script me montre le nombre d'entrées dans le fichier, ensuite lit une nouvelle structure au clavier, l'ajoute dans le fichier et montre le résultat.

Or, la dernière structure n'est pas écrite correctemment donc je me demande quelle est l'erreur dans ma fonction d'ajout...