Bonjour à tous,

c'est les mains moites et tremblantes de rage et de désespoir que je m'en remets à vous, à cette heure tardive où je dois terminer un bout de code plus faire une foultitude d'autres choses avant ce soir.

J'ai un code dont le rôle est d'analyser chaque ligne de deux fichiers triés. Chaque ligne est lue et comparée à la ligne de l'autre fichier.

Les deux fichiers sont nommés fichier FNR et fichier MPS.

pour chaque ligne, le préfixe de cette ligne (numéro de 11 caractère de long) est comparé à celui de la ligne de l'autre fichier. s'ensuivent trois cas :

-le préfixe du fichier FNR est inférieur à celui de MPS => la ligne FNR est non existante dans MPS. un traitement est fait puis une nouvelle ligne FNR est lue.

-le préfixe du fichier MPS est inférieur à celui de FNR => la ligne MPS est non existante dans FNR. un traitement est fait puis une nouvelle ligne MPS est lue.

-les deux préfixes sont égaux, les deux lignes sont correspondantes. Une vérification des autres champs composant les lignes est alors faite, et en cas de non-similitude un traitement est effectué.

Le problème que je rencontre est que la lecture d'une nouvelle ligne provoque un plantage après lu une nouvelle ligne dans les deux fichiers.

Dans mon exemple, deux première lignes sont lues, comparées. mes fichiers de tests font en sorte qu'elles sont égales. confoprmément à l'algo une nouvelle ligne est donc lue dans chaque fichier. ces deux nouvelles lignes ne sont pas égales, on passe donc dans le cas "donnée unique à FNR". et là, c'est le drame, tout accès au fichier FNR, que ce soit un fgets, un ftell, un fseek ou autre provoque un plantage.

Ca fait quatre heures que je cherche à savoir pourquoi, et j'estime ne plus avoir le recul et la patience nécessaires pour trouver. Je vous appelle donc à l'aide, et vous remercie de vos réponses par avance. Ma nuit en dépend, ainsi que mon avenir dans la boîte.

voici le 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
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
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
#include "biblio.h"


int main()
{
	FILE * fichier;
	FILE * fichierMPS;
	FILE * fichierFNR;
	char log[200];
	char * donneeFNR;
	char * donneeMPS;
	char temp1[150] = "";
	char temp2[150] = "";
	char * tempEnvironnement;
	char ** ligneConf;
	char ** correspondance;

	int i;
	int valeurRetour = 0;
	int valide = 1;
	int luMPS = 0;
	int luFNR = 0;
	double comp;

	//valeur pour le compte-rendu
	long compteurFNRUniques = 0;
	long compteurMPSUniques = 0;
	long compteurDiffIMSI = 0;
	long compteurDiffHLR = 0;
	long compteurDiffRN = 0;


	ligneConf = (char**)malloc(sizeof(char*));
	ligneConf[0] = (char *)malloc(sizeof(char) * 100);

	correspondance = (char**)malloc(sizeof(char*));
	correspondance[0] = (char *)malloc(sizeof(char) * 100);

	donneeFNR = (char *)malloc(sizeof(char) * 150);
	donneeMPS = (char *)malloc(sizeof(char) * 150);

	log[0] = '\0';



	

	/////////////////////////////////
	////////////////////////
	//////DEBUT DE LA COMPARAISON FNR1 - MPS
	////////////////////////
	/////////////////////////////////

	//logger
	AvoirDate(log);
	strcat(log, "Debut de la comparaison FNR-MPS...");
	AjouterEntree(g_CheminFichierCompteRenduAnalyse, log);

	//informer utilisateur 
	printf("\nDebut de la comparaison : FNR1 et MPS");

	if (((fichierFNR = fopen(g_CheminFichierDecodageFNR1, "r")) != NULL)&&((fichierMPS = fopen(g_CheminFichierDecodageMPS, "r")) != NULL))
        {

		//debut comparaison

		
printf("\nlol : %d", ftell(fichierFNR));
		//lecture de la premiere ligne de chaque fichier
		if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1;
                if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1;

printf("\nlol : %d", ftell(fichierFNR));

		//mettre dans temp1 le MSISDN de MPS
		strcpy(temp1, donneeMPS);
                Estrtok(temp1, ';', 0);

		//assigner a comp la valeur numerique du MSISDN  de MPS
                comp = atof(temp1);

		//assigner maintenant a temp1 le MSISDN de FNR
                strcpy(temp1, donneeFNR);
                Estrtok(temp1, ';', 0);


		//tant que la ligne de FNR1 lue ne commence pas par un MSISDN
                while((strlen(temp1) != 11)&&(luFNR ==0))
                {
                        //lire prochaine ligne
                        if((fgets(donneeFNR, 100, fichierFNR)) == NULL)luFNR = 1;

                        //selectionner le MSISDN
                        strcpy(temp1, donneeFNR);
                        Estrtok(temp1, ';', 0);
                }


		//boucle :
		//tant que les deux fichier n'ont pas ete entierement parcourus
		
		while((!luFNR)||(!luMPS))
                {
			//les fichiers sont senses etre tries. trois cas sont alors confrontes. Si MSISDN ligne FNR < MSISDN ligne MPS,
                        //alors c'est que le MSISDN MPS est manquant. l'inverse est teste aussi.
                        //si aucun des deux cas n'est releve, c'est que les deux MSISDN sont egaux, donc que c'est normal.
                        //s'ensuivent alors les traitement normaux

			//prendre les MSISDN des deux lignes
			//pour rappel comp vaut la valeur numerique du MSISDN de MPS
			// et temp1 vaut le MSISDN (string) de FNR

			//MSISDN unique a FNR
			if ((comp > atof (temp1))||((luMPS)&&(!luFNR)))
			{
printf("\nlol : %d", ftell(fichierFNR));
				//logger en tant que MSISDN unique a FNR1

				AvoirDate(log);
				strcat(log, "MSISDN unique a FNR1 par rapport a MPS : ");
				strcat(log, donneeFNR);
				AjouterEntree(g_CheminFichierLog, log);

printf("\nlol1");
printf("\nlol2");
				//lire nouvelle ligne FNR1
                                if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1;// CA PLANTE ICI
printf("\ncoucou1\n");

				//associer a temp1 le MSISDN de MPS
                                strcpy(temp1, donneeMPS);
				//assigner a comp la valeur numerique du MSISDN de MPS
                                Estrtok(temp1, ';', 0);
                                comp = atof(temp1);

				//associer a temp1 le nouveau MSISDN de FNR
                                strcpy(temp1, donneeFNR);
                                Estrtok(temp1, ';', 0);

				//incrementer le compteur
				compteurFNRUniques++;

				//tant que la ligne de FNR1 lue ne commence pas par un MSISDN
				while((strlen(temp1) != 11)&&(luFNR ==0))
				{
					//lire prochaine ligne
					if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1;

					//selectionner le MSISDN
					strcpy(temp1, donneeFNR);
					Estrtok(temp1, ';', 0);
				}


			}
			//MSISDN unique a MPS
			else if ((comp < atof(temp1))||((luFNR)&&(!luMPS)))
			{
printf("\ncoucou2\n");
				//logger en tant que MSISDN unique a MPS

				AvoirDate(log);
				strcat(log, "MSISDN unique a MPS par rapport a FNR1 : ");
				strcat(log, donneeFNR);
				AjouterEntree(g_CheminFichierLog, log);

				//incrementer le compteur
				compteurMPSUniques++;


				donneeMPS[0] = '\0';
                                //lire nouvelle ligne MPS
                                if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1;


				//associer a temp1 le nouveau MSISDN de MPS
                                strcpy(temp1, donneeMPS);
                                Estrtok(temp1, ';', 0);
				//assigner a comp la valeur numerique du MSISDN de MPS
                                comp = atof(temp1);

				//associer a temp1 le MSISDN de FNR
                                strcpy(temp1, donneeFNR);
                                Estrtok(temp1, ';', 0);


			}
			//les deux MSISDN sont communs
			else
			{
printf("\ncoucou3\n");
				//verifier la concordance des donnees associees

				//examiner le deuxieme champ de ligne FNR pour deteriner la nature des donnees a comparer
				strcpy(temp1, donneeFNR);
				Estrtok(temp1, ';', 1);

				//si c'est un couple MSISDN-RN chez FNR
				if (strlen(temp1) < 5)
				{
					//regarder le quatrieme champ dans MPS
					strcpy(temp2, donneeMPS);
					Estrtok(temp2, ';', 3);

					//si les deux champs sont egaux en rien faire,
					//si les deux champs sont differents logger
					if((strcmp(temp1, temp2)) != 0)
					{
						//prelever le MSISDN
						strcpy(temp1, donneeFNR);
						Estrtok(temp1, ';', 0);

						//logger
						AvoirDate(log);
						strcat(log, "difference de RN pour le MSISDN");
						strcat(log, temp1);
						strcat(log, "entre FNR1 et MPS");
						AjouterEntree(g_CheminFichierLog, log);

						//incrmenter le compteur
						compteurDiffRN++;
					}
				}
				//si c'est un trio MSISDN-IMSI-HLR chez FNR
				else
				{
					//regarder le deuxieme champ dans MPS (IMSI)
					strcpy(temp2, donneeMPS);
					Estrtok(temp2, ';', 1);

					//si les deux champs sont egaux verifier le HLR
					//sinon logger
					if((strcmp(temp1, temp2)) != 0)
					{
						//prelever le MSISDN
						strcpy(temp1, donneeFNR);
						Estrtok(temp1, ';', 0);

						//logger
						AvoirDate(log);
						strcat(log, "difference d'IMSI pour le MSISDN");
						strcat(log, temp1);
						strcat(log, "entre FNR1 et MPS");
						AjouterEntree(g_CheminFichierLog, log);

						//incrementer le compteur
						compteurDiffIMSI++;
					}
					else
					{
						//examiner maintenant les HLR des deux entrees
						strcpy(temp1, donneeFNR);
						Estrtok(temp1, ';', 2);

						strcpy(temp2, donneeMPS);
						Estrtok(temp2, ';', 2);

						//verifier les HLR a l'aide des tables
						i = Chercher(g_CheminTableauAssociationHLR, temp1);
						if (i > 0)correspondance = LireLigne (g_CheminTableauAssociationHLR, i, i);
						else
						{
							printf("\nLe numero de HLR %s, sense se trouver dans le fichier %s, n'a pas ete trouve. La commande MML ne sera pas ecrite.", g_CheminTableauAssociationHLR, temp1);

							//log
							AvoirDate(log);

							tempEnvironnement = getenv("PS1");

							Estrtok(tempEnvironnement, '@', 1);
							Estrtok(tempEnvironnement, ':', 0);

							if(tempEnvironnement != NULL){strcat(log, tempEnvironnement);strcat(log, ";");}
							else strcat(log, ";");

							strcat(log, "audit;");

							sprintf(log, "%s%d;", log, getpid());

							tempEnvironnement = getenv("USER");
							if(tempEnvironnement != NULL)strcat(log, tempEnvironnement);
							else strcat(log, ";");

							strcat(log, ";NOTICE;comparer.c;AUD;031;Le numero de HLR");

							strcat(log, temp1);
							strcat(log, "n'a pas ete trouve dans le fichier d'association. La commande MML de creation ne sera pas ecrite;;");

							AjouterEntree(g_CheminFichierLog, log);
						}
						Estrtok(correspondance[0], 164, 0);

						//assigner a temp1 la valeur du HLR de FNR
						strcpy(temp1, correspondance[0]);

printf("\ntemp1 : %s", temp1);
					}
				}

				donneeMPS[0] = '\0';
				donneeFNR[0] = '\0';

printf("\nlol : %d", ftell(fichierFNR));
                                //lire nouvelle ligne MPS
                                if((fgets(donneeMPS, 150, fichierMPS)) == NULL)luMPS = 1;
				//lire nouvelle ligne FNR1
                                if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1;

printf("\nlol : %d", ftell(fichierFNR));
				//associer a temp1 le nouveau MSISDN de MPS
                                strcpy(temp1, donneeMPS);
                                Estrtok(temp1, ';', 0);
				//assigner a comp la valeur numerique du MSISDN de MPS
                                comp = atof(temp1);

				//associer a temp1 le nouveau MSISDN de FNR
                                strcpy(temp1, donneeFNR);
                                Estrtok(temp1, ';', 0);

				//tant que la ligne de FNR1 lue ne commence pas par un MSISDN
				while((strlen(temp1) != 11)&&(luFNR ==0))
				{
					//lire prochaine ligne
					if((fgets(donneeFNR, 150, fichierFNR)) == NULL)luFNR = 1;

					//selectionner le MSISDN
					strcpy(temp1, donneeFNR);
					Estrtok(temp1, ';', 0);
				}
printf("\nlol : %d", ftell(fichierFNR));
			}
		}
		fclose(fichierFNR);
		fclose(fichierMPS);
	}
	else
	{
		//mettre la valeur de retour a 1 pour VTOm
		valeurRetour = 1;

		//informer utilisateur
		printf("\nErreur d'ouverture des fichiers de FNR1 ou MPS decodes.");

		//logger
		AvoirDate(log);
		strcat(log, "Erreur d'ouverture des fichiers de FNR1 ou MPS decodes. Fin de la comparaison");
		AjouterEntree(g_CheminFichierCompteRenduAnalyse, log);
	}



	return valeurRetour;
}
PS : les printf(lol); et autres sont des témoins pour le debug. c'est préhistorique mais j'en suis là