Je dois écrire une fonction chargée d'extraire le 2ème champs de chacune
des lignes d'un fichier texte (exemple de lignes reproduit en bas de post).
Ce champ est composé de 7 caractères (exemple : 945BB04) et je ne dois
stocker que les champs commençants par '9'. Bien sûr, avant de stocker
un champs, la fonction vérifie s'il n'a pas déjà été préalablement
stocké (champs identiques).
Mais je rencontre un problème en fonction de la fin du fichier qui peut
être n'importe quoi, c'est à dire que la dernière ligne du fichier peut
se terminer par n'importe quoi, exemples :
- par une série d'espaces SANS '\n' : le pgm fonctionne bien.
- par un '\n' (avec ou sans espace avant, peu importe) : le pgm
fonctionne bien.
- mais si la dernière ligne est composée uniquement d'espaces suivi OU
NON par un '\n' ou bien s'il y a plusieurs lignes d'espaces avec ou sans
'\n' à la fin : le pgm boucle indéfiniment.
Et c'est ce dernier cas qui pose un problème : le programme boucle
indéfiniment sur cette fin de fichier (lignes de code commentées en
majuscules)
Comment procéder pour que le programme fonctionne quelque soit la
dernière ligne?
Merci d'avance.
Michel
int caractereLu;
char **pTabIdPub = NULL;
char identifiantLu[TAILLE_BUFFER];
Booleen idNonStocke; /*typedef enum logique {FAUX, VRAI} Booleen; dans
un .h*/
int i;
int j = 0;
int k;
/* tant que l'on n'a pas atteint la fin de fichier */
while((caractereLu = fgetc(pFichierRF)) != EOF) {
i = 0;
idNonStocke = FAUX;
/* tant que l'on n'a pas trouvé un 9 */
while(caractereLu != '9')
caractereLu = fgetc(pFichierRF);
/* on mémorise le 9 */
identifiantLu[i++] = caractereLu;
/* on lit et mémorise jusqu'à l'espace suivant exclu, sans
toutefois dépasser 6 caractères */
while((caractereLu = fgetc(pFichierRF)) != ' ' && i < 7)
identifiantLu[i++] = caractereLu;
/* on ajoute le caractère de fin de chaine */
identifiantLu[i] = '\0';
/* on vérifie si le contenu de identifiantLu est déjà stocké */
if(j >= 1) {
for(k = 0; k < j; k++) {
if(strcmp(pTabIdPub[k], identifiantLu))
idNonStocke = VRAI;
}
}
if(j <= 1 || idNonStocke == VRAI) {
/* on réserve de la mémoire pour stocker un pointeur vers la chaine
id_de_la_pub */
if((pTabIdPub = realloc(pTabIdPub, sizeof(char*) *(j+1))) ==
NULL) {
printf("Module \"%s\"\nLigne %d : echec d'allocation memoire
par \"realloc\".\n"
"Le programme ne peut continuer.\n\n",
NOM_MODULE, __LINE__);
printf("Pressez <enter> pour quitter le programme.");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
/* on stocke l'identifiant de la pub */
if((pTabIdPub[j] = strdup(identifiantLu)) == NULL) {
printf("Module \"%s\"\nLigne %d : echec d'allocation memoire
par \"strdup\".\n"
"Le programme ne peut continuer.\n\n", NOM_MODULE,
__LINE__);
printf("Pressez <enter> pour quitter le programme.");
fflush(stdout);
getchar();
exit(EXIT_FAILURE);
}
}
j++;
/* on lit jusqu'à la ligne suivante : ICI LE PGM BOUCLE EN
FONCTION DU TYPE DE LA DERNIERE LIGNE */
while((caractereLu = fgetc(pFichierRF)) != '\n' /*|| caractereLu
!= EOF*/) {
if(caractereLu == EOF)
break;
}
}
/* affichage des lignes stockées */
for(k = 0; k < j; k++) {
printf("Ligne n. %05d : %s\n", k + 1, pTabIdPub[k]);
}
}