Bonjour à tous,

J'ai des petits problèmes pour lire mon fichier en accès direct, c'est a dire sélectionner un contact parmi le total dans mon fichier..

Voici mon code pour pour l'écriture et lecture du fichier sequentiel qui marche très bien :

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
 
void partie1Saisie() // Appel de la saisie partie 1
{
	system("cls"); // On éfface l'écran
 
	// On présente ici l'exercice
	printf("________________________________________________\n"
			"Partie 1 - Fichier sequentiel :\n"
			"------------------------------------------------\n"
			"Saisir et enregistrer\n"
			"------------------------------------------------\n\n");
 
	// Déclaration & Initialisation des variables
	annuaire UnAnnuaire = {"", "", 0, 0}; // On initialise l'instanciation de struct annuaire
	char ajoutContact = NULL;
	char initAnnuaire = NULL;
	int lignesFichier = 0; // Compteur lignes du fichier
 
// DEBUT
	printf("Souhaitez vous initialiser l'annuaire ? -> [i]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
	fflush(stdin); // On vide le flux
	scanf("%c", &initAnnuaire);
 
	if (initAnnuaire == 'i')
	{
		/* On compte le nombre de lignes total que contient le fichier,
		on ferme et on réouvre pour saisir les chaines */
		f = fopen("fichiers\\annuaire.txt", "w+"); // Ouverture et initialisation
		lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
		fclose(f); // On ferme
 
		f = fopen("fichiers\\annuaire.txt", "w+"); // Ouverture en écriture + initialisation
		// Le pointeur "f" devient alors un pointeur sur "annuaire.txt"
 
		printf("\n	**  Annuaire initialise  **\n\n"
			   "Contacts (%d)\n", lignesFichier);
	}
		else
		{	
			/* On compte le nombre de lignes total que contient le fichier,
			on ferme et on réouvre pour saisir les chaines */
			f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
			lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
			fclose(f); // On ferme
 
			f = fopen("fichiers\\annuaire.txt", "a"); // Ouverture en écriture ajout (append)
 
			printf("\n	**  Ouverture de l'annuaire en mode append (ajout) **\n\n"
				   " Contacts (%d)\n", lignesFichier);
		}
	printf("------------------------------------------------\n\n");
 
	if (f != NULL) // On verifie bien que le fichier a été crée
	{
		nouveauContact_P1(lignesFichier);
 
		printf("\n\nAjouter un contact a l'annuaire -> [a]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
		fflush(stdin); // On vide le flux
		scanf("%c", &ajoutContact);
		printf("------------------------------------------------\n\n");
 
		while (ajoutContact == 'a')
		{
			lignesFichier++; // On ajoute 1 au compteur de lignes
			nouveauContact_P1(lignesFichier);
 
			printf("\n\nAjouter un contact a l'annuaire -> [a]\nAppuyer sur une touche pour continuer..\n\n Votre choix : ");
			fflush(stdin); // On vide le flux
			scanf("%c", &ajoutContact);
			printf("------------------------------------------------\n\n");
		}
		fclose(f); // Fermeture du fichier
	}
		else
		{
			printf("Impossible d'ouvrir le fichier");
		}
 
// FIN
}
 
void partie1Lire() // Appel de la lecture partie 1
{
	system("cls"); // On éfface l'écran
 
	// On présente ici l'exercice
	printf("________________________________________________\n"
			"Partie 1 - Fichier sequentiel :\n"
			"------------------------------------------------\n"
			"Lecture du fichier\n"
			"------------------------------------------------\n\n");
 
	// Déclaration & Initialisation des variables
	annuaire UnAnnuaire;
	#define TAILLE_MAX 50 // On définit la taille max de la chaine de caractère
	char *pointeur = NULL;
	char *separateur = { ";;" }; // Definition du séparateur
	char *buffer = NULL;
	int i=1;
	int lignesFichier = 0; // Compteur lignes du fichier
	char chaine[TAILLE_MAX] = ""; // Tableau pour recevoir la chaine complete du fichier
	char *Chaine_Entrante=("%s",chaine); // On copie la chaine de caractère pour la traité
	// Tableaux pour recevoir la valeur de chaques elements de la chaine complete
	char nom[21];
    char numeroTel[16];
	char age[4];
	char numeroC[5]; // recupere le numero du contact
 
// DEBUT
 
	 /* On compte le nombre de lignes total que contient le fichier,
	on ferme et on réouvre au debut pour traiter les chaines */
    f = fopen("fichiers\\annuaire.txt", "r"); // Ouverture en mode lecture "read"
	lignesFichier = nb_lignes (f); // Compte le nombre de lignes du fichier
	fclose(f); // On ferme
	f = fopen("fichiers\\annuaire.txt", "r"); // On réouvre en read
 
    if (f != NULL)
    {
		printf("                   ** Annuaire **\n"
				"------------------------------------------------\n"
				"_____Contacts : %d\n\n"
				"_Nom :\t\t\tAge :\tNumero de telephone :\tNumero du contact :\n\n", lignesFichier);
 
        while (fgets(chaine, TAILLE_MAX, f) != NULL) // On lit le fichier tant qu'on ne reçoit pas d'erreur (NULL)
        { 
			buffer = strdup ( Chaine_Entrante ); // Duplique la chaine de caractère
 
			// Premier appel
			pointeur = strtok( buffer, separateur ); // Coupe la chaine de caractère au niveau du séparateur
			strcpy(nom, pointeur); // Copie le dans le tableau nom
 
			while( pointeur != NULL )
			{
				// Cherche les autres separateur
				pointeur = strtok( NULL, separateur ); // On coupe la chaine de caractère tant qu'on ne reçoit pas d'erreur (NULL)
 
				if ( pointeur != NULL )
				{
					 i++;
					 if ( i == 2 )
					 {
						strcpy(age, pointeur); // Copie l'age dans le tableau age
					 }
						if ( i == 3 ) 
						{
							 strcpy(numeroTel, pointeur); // Copie le numero de tel. dans le tableau numeroTel
						}
				if ( i == 4 ) 
				{
					strcpy(numeroC, pointeur); // Copie le numero du contact dans le tableau numeroC
					// On gere l'affichage correctement en fonction de la longueur du nom
					 if (strlen(nom) < 8)
					 {
						 printf("%s\t\t\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC); // On affiche la chaine du contact
					 }
						else if ((strlen(nom) >= 8) && (strlen(nom) < 16))
						{
							printf("%s\t\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC);
						}
							else
							{
								printf("%s\t%s\t%s\t\t-> %s", nom, age, numeroTel, numeroC);
							}
					i = 1; // On réinitialise i à 1 (car 4 elements dans une chaine de caractères)
				}	
				} 
			}
        }
        fclose(f);
	}
		else
		{
			printf("Impossible d'ouvrir le fichier");
		}
 
// FIN
}
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
 
/*___________________________________________________________________________________________*/
/*________________________________FONCTIONS SECONDAIRES_____________________________________*/
 
 
void nouveauContact_P1(int lignesFichier)
{
	// Declaration & Initialisation des variables
	//char age[10]; // variable permettant de transtyper l'age dans une chaine de caractère
	annuaire UnAnnuaire;
 
// DEBUT
	lignesFichier++; // On ajoute 1 au compteur de lignes
	printf("_____________Nouveau Contact -> c%d\n\n", lignesFichier);
 
	// Saisie du NOM
	while (strlen(UnAnnuaire.Nom) > 20) // Calcule la longueur de la chaine
	{
		printf("\nNom (max 20 caracteres) : ");
		scanf("%s", UnAnnuaire.Nom);
		if (strlen(UnAnnuaire.Nom) > 20)
		{
			printf("\n*Format incorrect, ressaisisez : ");
		}
 
	}	
	printf("                         -----------------------\n");
 
	// Saisie de l'AGE
	printf("Age : ");
	/* On sécurise la saisie contre les caractères, et les nombres iréels
	on vérifie si scanf renvoie bien un nombre */
	while ((scanf("%d", &UnAnnuaire.Age) <= 0) || ((UnAnnuaire.Age > 150) || (UnAnnuaire.Age <= 0)))
	{
		/* On indique à l'utilisateur que la saisie n'est pas correct 
		puis on redemande la saisie tant que la condition n'est pas remplie */
		if ((scanf("", &UnAnnuaire.Age) <= 0) || ((UnAnnuaire.Age > 150) || (UnAnnuaire.Age <= 0)))
		{
			printf("\n*Format incorrect, ressaisisez : "
					"\nAge : ");
		}
 
		// Si ce n'est pas le cas, on vide le buffer, et on redemande avec la boucle while
		purger();
	}
	printf("     ---\n");
 
	//sprintf(age, "%d", UnAnnuaire.Age); // Transtype Age de UnAnnuaire dans une chaine de caractère 'age'
 
	// Saisie du NUMERO DE TELEPHONE
	while ((strlen(UnAnnuaire.NumeroTel) > 14) || (strlen(UnAnnuaire.NumeroTel) < 14)) // Calcule la longueur de la chaine
	{
		printf("Numero de telephone (xx-xx-xx-xx-xx) : ");
		fflush(stdin); // On vide le flux
		scanf("%s", UnAnnuaire.NumeroTel);
 
		if ((strlen(UnAnnuaire.NumeroTel) > 14) || (strlen(UnAnnuaire.NumeroTel) < 14))
		{
			printf("\n*Format incorrect, ressaisisez : \n");
		}
 
	}	
	printf("                                      --------------\n");
	UnAnnuaire.numeroContact = lignesFichier; // On affecte la valeur de lignesFichier au numeroContact
 
	// On copie dans le fichier avec le numero de la ligne correspondant
	fprintf(f,"%s;;%d;;%s;;c%d\n", UnAnnuaire.Nom, UnAnnuaire.Age, UnAnnuaire.NumeroTel, UnAnnuaire.numeroContact); 
 
// FIN
}
J'aurais besoin de conseils sur les fonctions a utiliser, pour sélectionner une ligne spécifique dans mon fichier. Je trouve pas mon bonheur sur le net..

De plus j'aimerais savoir comment faire des enregistrements de taille fixe, cela me pose des problèmes après pour l'affichage.

Merci