OVH Cloud OVH Cloud

Problème avec une fin de fichier

11 réponses
Avatar
Michel
Bonjour,

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


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "entete.h"
#include "definition.h"
#define NOM_MODULE "TraiterFichierRF.c"
#define TAILLE_BUFFER 8

void TraiterFichierRF(FILE *pFichierRF) {

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]);
}
}

Exemple de lignes contenues dans le fichier :

SINGLE 945BB04 PUB ABALONE
00:00:20.15 09:59:59.17 12/01/2003 0
12/01/2003 00:00:00 12/31/2003
KJH
Beta Stereo
SINGLE 942BB27 PUB AIRWICK
00:00:15.15 09:59:59.17 11/02/2003 0
11/02/2003 00:00:00 12/02/2003
AA
Beta Stereo
SINGLE 937BB30 PUB AIRWICK
00:00:20.15 09:59:59.17 09/22/2003 0
09/22/2003 00:00:00 10/22/2003
UYI
Beta Stereo
SINGLE 947BB15 PUB AMBIPUR
00:00:20.15 09:59:59.17 11/22/2003 0
11/22/2003 00:00:00 12/22/2003
GFV
Beta Stereo
SINGLE 941BB09 PUB ANDROS
00:00:15.16 09:59:59.17 10/09/2003 0
10/09/2003 00:00:00 11/08/2003
FG
Beta Stereo
SINGLE 941BB07 PUB ANDROS
00:00:15.16 09:59:59.17 10/09/2003 0
10/09/2003 00:00:00 11/08/2003
FG
Beta Stereo

1 réponse

1 2
Avatar
Michel

/* on recherche le premier '9' de la ligne */
if((pCaractereTrouve = strchr(ligneLue, '9')) == NULL)
break;



Moué, c'est un peu capilotracté:
if (A) {/* rien */} else {quelquechose();}


Oui, c'était parfaitement inutile. C'est corrigé.
Merci.
Michel



1 2