Bonjour les developpeurs.
Alors voilà je suis pas une flèche en C et j'ai pas réussi à trouver les infos nécessaires pour résoudre mon problème donc je m'en remet à vous.

Mon code
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define NMAX 20
#define nomFichier "toto.dat"
 
struct s_personne {
    char nom[NMAX];
    char prenom[NMAX];
    int age;
};
 
typedef struct s_personne personne;
 
void saisiePersonnes(personne ** tbPersonnes, int * nbPersonnes) {
    char continuer;
    int i;
    personne tbPerso[30];
 
    *nbPersonnes = 0;
    printf("Saisie des infos de personnes (30 max)\n");
    do {
        printf("Personne %d\n", *nbPersonnes);
        printf("nom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].nom));
        printf("prenom = "); scanf("%s", &(tbPerso[ *nbPersonnes ].prenom));
        printf("age = "); scanf("%d", &(tbPerso[ *nbPersonnes ].age));
        *nbPersonnes = *nbPersonnes + 1;
 
        printf("Autre personne (o/n) ? ");
        do {
            scanf("%c", &continuer);
        } while (continuer != 'o' && continuer != 'n');
    } while (continuer == 'o');
 
    if (*tbPersonnes = (personne *)malloc(*nbPersonnes * sizeof(personne))) {
        for (i=0; i < *nbPersonnes; i++) {
             (*tbPersonnes)[i] = tbPerso[i];
        }
    } else
        printf("Problème d'allocation mémoire.\n");
 
	printf("\n");
}
 
void creerFichierPersonnes (personne * tbPersonnes, int nbPersonnes) {
    FILE * fBin;
    if (fBin = fopen(nomFichier, "wb")) {
        fwrite(tbPersonnes, sizeof(personne), nbPersonnes, fBin);
        fclose(fBin);
    } else {
        printf("Impossible d'ouvrir le fichier %s en écriture.", nomFichier);
    }
}
 
void editerFichierPersonnes () {
	char nomPerso[NMAX+1];
	int tailleChaine, i;
	FILE * fBin;
	personne p;
 
	// Initialisation du tableau
	for (i=0; i <= NMAX; i++)
		nomPerso[i] = '\0';
 
	fflush(stdin);
	printf("Entrez le nom de la personne pour laquelle vous voulez modifier les infos = \n");
	fgets(nomPerso, NMAX+1, stdin);
 
	// Si la chaine entrée est inférieure à NMAX caractères, on supprime le dernier \n
	i = 0;
	while (nomPerso[i]) {
		if (nomPerso[i] == '\n')
			nomPerso[i] = '\0';
		i++;
	}
 
	if (fBin = fopen(nomFichier, "r+b")) {
        while (fread(&p, sizeof(personne), 1, fBin) > 0) {
			printf("pos = %d\n", ftell(fBin));
			if (!strcmp(p.nom, nomPerso)) {
				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
				printf("Entrez un nouvel âge = ");
				scanf("%d", &(p.age));
 
				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
				fseek(fBin, -sizeof(personne), SEEK_CUR);
				// Enregistre la structure modifiée dans le fichier
				fwrite(&p, sizeof(personne), 1, fBin);
			}
		}
		fclose(fBin);		
	} else
        printf("Impossible d'ouvrir le fichier %s en lecture / écriture.", nomFichier);
}
 
void afficherPersonnes() {
    FILE * fBin;
    personne p;
    if (fBin = fopen(nomFichier, "rb")) {
        printf("Listing des personnes\n");
        while (fread(&p, sizeof(personne), 1, fBin) > 0)
            printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
        fclose(fBin);
		printf("\n");
    } else {
        printf("Impossible d'ouvrir le fichier %s en lecture.", nomFichier);
    }
}
 
int main() {
    personne * tbPersonnes;
    int nbPersonnes;
 
    saisiePersonnes(&tbPersonnes, &nbPersonnes);
    creerFichierPersonnes(tbPersonnes, nbPersonnes);
    free(tbPersonnes);
 
    afficherPersonnes();
    editerFichierPersonnes();
	afficherPersonnes();	
 
    return 0;
}
En fait c'est un exercice de td que j'arrive pas à faire fonctionner (sur le papier ça fonctionnait très bien pourtant ^^).
Le but
- Saisir des infos (nom, prenom, age) d'une liste de personnes
- Creer le fichier binaire contenant cette liste de personnes
- Lire ce fichier binaire
- Demander un nom à l'utilisateur, le rechercher dans le fichier et pour chaque occurence trouvée demander un nouvel âge et faire la modification dans le fichier et c'est là que ça coince.

Le code incriminé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
        while (fread(&p, sizeof(personne), 1, fBin) > 0) {
			printf("pos = %d\n", ftell(fBin));
			if (!strcmp(p.nom, nomPerso)) {
				printf("%-10s %-10s %d\n", p.nom, p.prenom, p.age);
				printf("Entrez un nouvel âge = ");
				scanf("%d", &(p.age));
 
				// Déplacement du pointeur du fichier à la fin de l'enregistrement précédent
				fseek(fBin, -sizeof(personne), SEEK_CUR);
				// Enregistre la structure modifiée dans le fichier
				fwrite(&p, sizeof(personne), 1, fBin);
			}
		}
En fait le programme ne s'arrête jamais, il me demande toujours d'entrer un nouvel âge comme si le fichier s'agrandissait ...

PS: désolé d'avoir posté antant de code mais cela vous permettra de tester par vous-même (j'utilise dev-c++ sous windows xp)