Gros pb boucle while lecture fichier

casers Messages postés 49 Statut Membre -  
casers Messages postés 49 Statut Membre -
Bonjour,
Voici un prog qui devrai me construire un arbre:

noeud *ClientRacine;
StructClient *Client;
noeud *ClientTest;
FILE *FichierClient;
int compt=0;
char ligne[255];
char *p;

// Ouverture du fichier.
FichierClient = fopen("FOURNISSEURS.CSV","r+");

// La construction de l'arbre ce fera par lecture sequentielle du fichier qui
// repertorie les clients.
while(fscanf( FichierClient,"%s\n", ligne), !feof(FichierClient))
{
printf("%d:%s\n",compt,ligne);

char *debut;
// Il faut ensuite replacer la ligne lue dans la structure.

debut = strtok (ligne,";");

Client->CodeClient = (char*) malloc(sizeof debut);

Client->CodeClient = debut;
debut = strtok (NULL,";");
Client->NomClient = (char*) malloc(sizeof debut);
Client->NomClient = debut;
debut = strtok (NULL,";");
Client->MDP = (char*) malloc(sizeof debut);
Client->MDP = debut;
debut = strtok (NULL,";");
Client->SoldeCompteClient = (char*) malloc(sizeof debut);
Client->MDP = debut;

// Le premier client lu est provisoirement inséré comme etant
// la racine de l'arbre. Mais les loies de l'arbre noir et rouge peuvent
// si necessaire modifier ce noeud pour garder l'arbre equilibré.

if (compt==0)
{
ClientRacine = NouveauNoeud(NULL,Client);
printf("%s:%s\n","Premier client enregistre en memoire",
ClientRacine->InfoClient->NomClient);
compt++;

}
else
ClientTest = insersion(ClientRacine,Client);

gets(p);
}

fclose(FichierClient);
printf("%s\n"," Chargement de l'arbre binaire rouge et noir effectué.");
return ClientRacine;
}

La premier lecture marche mais a paritr de la deuxieme lecture dans le while sa plante....????

kelkun at-il une reponce?

merci bcp.
A voir également:

2 réponses

le père
 
1
Client->CodeClient = (char*) malloc(sizeof debut);

debut est un pointeur
sizeof (debut) représente la taille de ce pointeur
or, ce dont tu as besoin, c'est de la longueur de la chaine pointée par début, ce qui est très différent :

strlen(debut)+1 (+1 pour le zéro final)

2
Client->CodeClient = (char*) malloc(sizeof debut);
Client->CodeClient = debut;

la première ligne, tu alloues de la mémoire et tu enregistres l'adresse de la mémoire allouée dans Client->CodeClient
la deuxième ligne, tu remplaces Client->CodeClient par le pointeur debut
donc, tu as perdu l'adresse de la mémoire allouée. Tu ne pourras jamais utiliser cette mémoire (ce n'était pas la peine de l'allouer) ni la libérer !
En effet, Client->CodeClient est un pointeur et non pas une chaîne. de même pour debut. quand tu fais Client->CodeClient = debut; tu recopies un pointeur dans un autre, tu ne recopies pas une chaîne
pour recopier la chaîne, utilise strcpy

bonne continuation
0
casers Messages postés 49 Statut Membre
 
merci encore pour la patience..je viende me rendre compte que vous me l'aviez deja repete qque deux fois....
En tout cas c enregistré.
0