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.
Configuration: Windows Vista
Firefox 2.0.0.11

2 réponses

  1. 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
  2. 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