Je realise une fonction qui extrait des données d'un fichier texte dans le
cadre d'un projet de gestion d'aeroport.
J'arrive à extraire correctement ces données, mais lorsque je les met dans
mes listes chainées (j'en utilise une pour le decollage, une pour
l'atterissage), le programme devient instable !
Je dois avoir une fuite qq part :(
Merci à ceux pouvant m'aider.
Cordialement,
/*
Projet: Gestionnaire d'Aeroport
Fichier: programmation.h
Date: Novembre-Decembre 2003
Auteur: -
Info: prototypes fonctions recuperant les données d'un fichier texte
*/
#ifndef READFILEH
#define READFILEH
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "typedefinition.h"
#include "listgestionnar.h"
#include "econio.h"
t_base *readfile(const char file[]);
int inputcommand(t_base *handleprog,const unsigned long time, t_basedeco
*handledeco, t_baseatter *handleatter);
#endif
/*
Projet: Gestionnaire d'Aeroport
Fichier: programmation.c
Date: Novembre-Decembre 2003
Auteur:-
Info: fonction permettant de recuperer les données d'un fichier texte
*/
#include "programmation.h"
t_base *readfile(const char file[])
{
char buffer[12];
char tmpfuel[4];
char tmp3[3];
char nom[5];
int erreur = 1;
unsigned long time=0, timer=0;
long fuel, conso;
FILE *fp;
t_fdeco *pdeco, *tmpd, *tmpdprev;
t_fatter *patter, *tmpa, *tmpaprev;
t_base *base;
pdeco = NULL;
patter = NULL;
if(!(fp=fopen(file, "r")))
base = NULL;
else
{
if (!(base = (t_base *)malloc(sizeof(t_base))))
base = NULL;
else
{
//initialisation
base->atter = NULL;
base->deco = NULL;
//on lit le fichier, et on on trouve chaque mot
while(( fscanf(fp,"%s", buffer) == 1 ) && erreur)
{
//on regarde si c une inscritpion temporelle
if (strlen(buffer) == 2)
{
if (atoi(buffer))
{
if( timer < (unsigned long)atoi(buffer) )
timer = (unsigned long)atoi(buffer);
}
}
else if(strlen(buffer) == 12)
{
if (buffer[0]=='D') // classement des évènements par catégories
{
//on recupere le vol
strncpy(nom, &buffer[8],4);
nom[4] = '\0';
//on recupere l'heure
strncpy(tmp3, &buffer[6],2);
tmp3[2]='\0';
if( time = atoi(tmp3))
{
//on regarde si on ajoute pas un avion qui devrait deja avoir decollé
if( timer <= time )
{
//on ajoute dans la liste chainée
if ( pdeco == NULL )
{
//on le fait considerer comme le premier element;
if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))
{
pdeco = tmpd;
base->deco = pdeco;
//on met les données
strcpy(tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
}
else
erreur = 0;
}
else
{
tmpdprev = tmpd;
if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))
{
//on met les données
strcpy(tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
tmpdprev->next = tmpd;
}
else
erreur = 0;
}
}
}
}
else if (buffer[0]=='A')
{
//on recupere le vol
strncpy(nom, &buffer[8],4);
nom[4] = '\0';
//on recupere l'essence
strncpy(tmpfuel, &buffer[1],3);
tmpfuel[3]='\0';
//on recupere la conso
strncpy(tmp3, &buffer[4],2);
tmp3[2] = '\0';
if ((fuel=atoi(tmpfuel)) && ( conso=atoi(tmp3)))
{
//on ajoute dans la liste chainée
if (patter == NULL)
{
//on le fait considerer comme le premier element;
if (tmpa = (t_fatter *)malloc(sizeof(t_fatter)))
{
patter = tmpa;
base->atter = patter;
//on met les données
strcpy(tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
}
else
erreur = 0;
}
else
{
tmpaprev = tmpa;
if (tmpa = (t_fatter *)malloc(sizeof(t_fatter)))
{
//on met les données
strcpy(tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
tmpaprev->next = tmpa;
}
else
erreur = 0;
}
}
}
}
}
}
fclose(fp);
}
return base;
/*
Projet: Gestionnaire d'Aeroport
Fichier: typedefinition.h
Date: Novembre-Decembre 2003
Auteur: -
Info: definition des differentes structures utilisées
Si tu veux que qqn regarde ton code de listes chaînées, tu aurais intérêt à l'isoler du reste.
//on ajoute dans la liste chainée
if ( pdeco == NULL )
{
//on le fait considerer comme le premier element;
if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))
{
pdeco = tmpd;
base->deco = pdeco;
//on met les données
strcpy(tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
}
else
erreur = 0;
}
else
{
tmpdprev = tmpd;
if (tmpd = (t_fdeco *)malloc(sizeof(t_fdeco)))
{
//on met les données
strcpy(tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
tmpdprev->next = tmpd;
}
else
erreur = 0;
}
}
}
Emmanuel Delahaye
In 'fr.comp.lang.c', "Anonyme" wrote:
J'ai repris l'ensemble du code, et je l'ai mis en forme. J'ai ajouté un petit code de test (il manque une fonction de destruction).
Remarques générales:
1 - Eviter les affectations dans les tests. Ca rend le code difficile à lire, et on se demande si tu n'as pas confondu '=' avec '=='.
2 - Simplifier l'utilisation de malloc() au strict nécessaire :
type_s *p = malloc (sizeof *p);
Ca allège l'écriture et la lecture.
3 - Définir les variables là où on en a besoin. Ca rend le code plus facile à lire et à vérifier, ça le prépare au découpage en fonctions.
4 - Soigner l'indentation
5 - Eviter les accentuées (pas de normalisation)
6 - Eviter les commentaires '//'. Il ne sont pas supportés en C90.
7 - Il est d'usage, pour être fair play avec les anciens systèmes, que les noms de fichiers ne dépasse pas le format 8.3 (C'est ce que fait le langage C avec ses headers)
8 - Les noms des fichiers et le découpage ne sont pas un modèle de clarté!
9 - Eviter les lignes de plus de 76 colonnes.
10 - Il manque la définition du format du fichier de donnees.
/* Projet: Gestionnaire d'Aeroport Fichier: programmation.c Date: Novembre-Decembre 2003 Auteur: - Info: fonction permettant de recuperer les donnees d'un fichier texte */
/* on lit le fichier, et on on trouve chaque mot */ while ((fscanf (fp, "%s", buffer) == 1) && !err) { /* on regarde si c une inscritpion temporelle */ if (strlen (buffer) == 2) { if (atoi (buffer)) { if (timer < (unsigned long) atoi (buffer)) timer = (unsigned long) atoi (buffer); } } else if (strlen (buffer) == 12) { if (buffer[0] == 'D') /* classement des evenements par categories */ { char tmp3[3]; char nom[5]; /* on recupere le vol */ strncpy (nom, &buffer[8], 4); nom[4] = ' '; /* on recupere l'heure */ strncpy (tmp3, &buffer[6], 2); tmp3[2] = ' ';
time = atoi (tmp3); if (time != 0) { /* on regarde si on ajoute pas un avion qui devrait deja avoir decolle */ if (timer <= time) { t_fdeco *tmpd; /* on ajoute dans la liste chainee */ if (pdeco == NULL) { /* on le fait considerer comme le premier element; */ tmpd = malloc (sizeof *tmpd);
if (tmpd != NULL) { pdeco = tmpd; base->deco = pdeco; /* on met les donnees */ strcpy (tmpd->numfly, nom); tmpd->time = time; tmpd->timer = timer; tmpd->next = NULL; } else { err = 1; } } else { t_fdeco *tmpdprev; tmpdprev = tmpd; tmpd = malloc (sizeof *tmpd); if (tmpd != NULL) { /* on met les donnees */ strcpy (tmpd->numfly, nom); tmpd->time = time; tmpd->timer = timer; tmpd->next = NULL; tmpdprev->next = tmpd; } else { err = 1; } } } } } else if (buffer[0] == 'A') { char tmpfuel[4]; char tmp3[3]; char nom[5]; long fuel; long conso; /* on recupere le vol */ strncpy (nom, &buffer[8], 4); nom[4] = ' '; /* on recupere l'essence */ strncpy (tmpfuel, &buffer[1], 3); tmpfuel[3] = ' '; /* on recupere la conso */ strncpy (tmp3, &buffer[4], 2); tmp3[2] = ' '; fuel = atoi (tmpfuel); conso = atoi (tmp3); if (fuel != 0 && conso != 0) { t_fatter *tmpa; /* on ajoute dans la liste chainee */ if (patter == NULL) { /* on le fait considerer comme le premier element; */ tmpa = malloc (sizeof *tmpa); if (tmpa) { patter = tmpa; base->atter = patter; /* on met les donnees */ strcpy (tmpa->numfly, nom); tmpa->conso = conso; tmpa->fuel = fuel; tmpa->timer = timer; tmpa->next = NULL; } else { err = 1; } } else { t_fatter *tmpaprev; tmpaprev = tmpa; tmpa = malloc (sizeof *tmpa); if (tmpa) { /* on met les donnees */ strcpy (tmpa->numfly, nom); tmpa->conso = conso; tmpa->fuel = fuel; tmpa->timer = timer; tmpa->next = NULL; tmpaprev->next = tmpa; } else { err = 1; } } } } } } } fclose (fp); } return base; }
/* main.c */ #include "prog.h"
int main (void) { t_base *handleprog = readfile ("data.txt");
/* structure de base pour decollage */ typedef struct s_basedeco { /* liste chainee vers strucuture contenant l'ensemble des avions * decollants */ t_deco *ls;
/* liste chainee vers les avions a traiter */ t_deco *actual;
/* nombre d'avions decollant ou decolle dans la liste */ unsigned long nb;
/* nombre d'avion ayant decoller */ unsigned long nbtooken;
/* retard total */ unsigned long late; } t_basedeco;
/* Strucuture decollage pour fichier */ typedef struct s_fdeco { char numfly[5]; unsigned long time; unsigned long timer; struct s_fdeco *next; } t_fdeco;
/* structure atterissage */ typedef struct s_atter { char numfly[5]; long fuel; long conso; unsigned long time; int etat; struct s_atter *next; } t_atter;
/* structure de base pour aterissage */ typedef struct s_baseatter { t_atter *insky; /* avion dans le ciel */ t_atter *onearth; /* Avion crashes ou ayant atteri */ t_atter *lastonearth; /* Dernier element de onearth */ unsigned long nb; /* nombre d'avions dans la liste */ unsigned long nbonearth; /* nombre d'avions atteris */ unsigned long nbcrash; /* nombre d'avions crashe */ unsigned long nbemergency; /* nombre d'avions atteri en urgence */ } t_baseatter;
/* structure atterissage pour fichier */ typedef struct s_fatter { char numfly[5]; long fuel; long conso; unsigned long timer; struct s_fatter *next; } t_fatter;
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', "Anonyme" <i.am.newic@spamsux.wanadoo.fr>
wrote:
J'ai repris l'ensemble du code, et je l'ai mis en forme. J'ai ajouté un
petit
code de test (il manque une fonction de destruction).
Remarques générales:
1 - Eviter les affectations dans les tests. Ca rend le code difficile à
lire,
et on se demande si tu n'as pas confondu '=' avec '=='.
2 - Simplifier l'utilisation de malloc() au strict nécessaire :
type_s *p = malloc (sizeof *p);
Ca allège l'écriture et la lecture.
3 - Définir les variables là où on en a besoin. Ca rend le
code plus facile à
lire et à vérifier, ça le prépare au
découpage en fonctions.
4 - Soigner l'indentation
5 - Eviter les accentuées (pas de normalisation)
6 - Eviter les commentaires '//'. Il ne sont pas supportés en C90.
7 - Il est d'usage, pour être fair play avec les anciens systèmes,
que les
noms de fichiers ne dépasse pas le format 8.3 (C'est ce que fait le
langage C
avec ses headers)
8 - Les noms des fichiers et le découpage ne sont pas un modèle de
clarté!
9 - Eviter les lignes de plus de 76 colonnes.
10 - Il manque la définition du format du fichier de donnees.
/*
Projet: Gestionnaire d'Aeroport
Fichier: programmation.c
Date: Novembre-Decembre 2003
Auteur: -
Info: fonction permettant de recuperer les donnees d'un fichier texte
*/
/* on lit le fichier, et on on trouve chaque mot */
while ((fscanf (fp, "%s", buffer) == 1) && !err)
{
/* on regarde si c une inscritpion temporelle */
if (strlen (buffer) == 2)
{
if (atoi (buffer))
{
if (timer < (unsigned long) atoi (buffer))
timer = (unsigned long) atoi (buffer);
}
}
else if (strlen (buffer) == 12)
{
if (buffer[0] == 'D') /* classement des evenements par
categories */
{
char tmp3[3];
char nom[5];
/* on recupere le vol */
strncpy (nom, &buffer[8], 4);
nom[4] = ' ';
/* on recupere l'heure */
strncpy (tmp3, &buffer[6], 2);
tmp3[2] = ' ';
time = atoi (tmp3);
if (time != 0)
{
/* on regarde si on ajoute pas un avion qui devrait deja avoir decolle */
if (timer <= time)
{
t_fdeco *tmpd;
/* on ajoute dans la liste chainee */
if (pdeco == NULL)
{
/* on le fait considerer comme le premier element; */
tmpd = malloc (sizeof *tmpd);
if (tmpd != NULL)
{
pdeco = tmpd;
base->deco = pdeco;
/* on met les donnees */
strcpy (tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
}
else
{
err = 1;
}
}
else
{
t_fdeco *tmpdprev;
tmpdprev = tmpd;
tmpd = malloc (sizeof *tmpd);
if (tmpd != NULL)
{
/* on met les donnees */
strcpy (tmpd->numfly, nom);
tmpd->time = time;
tmpd->timer = timer;
tmpd->next = NULL;
tmpdprev->next = tmpd;
}
else
{
err = 1;
}
}
}
}
}
else if (buffer[0] == 'A')
{
char tmpfuel[4];
char tmp3[3];
char nom[5];
long fuel;
long conso;
/* on recupere le vol */
strncpy (nom, &buffer[8], 4);
nom[4] = ' ';
/* on recupere l'essence */
strncpy (tmpfuel, &buffer[1], 3);
tmpfuel[3] = ' ';
/* on recupere la conso */
strncpy (tmp3, &buffer[4], 2);
tmp3[2] = ' ';
fuel = atoi (tmpfuel);
conso = atoi (tmp3);
if (fuel != 0 && conso != 0)
{
t_fatter *tmpa;
/* on ajoute dans la liste chainee */
if (patter == NULL)
{
/* on le fait considerer comme le premier element; */
tmpa = malloc (sizeof *tmpa);
if (tmpa)
{
patter = tmpa;
base->atter = patter;
/* on met les donnees */
strcpy (tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
}
else
{
err = 1;
}
}
else
{
t_fatter *tmpaprev;
tmpaprev = tmpa;
tmpa = malloc (sizeof *tmpa);
if (tmpa)
{
/* on met les donnees */
strcpy (tmpa->numfly, nom);
tmpa->conso = conso;
tmpa->fuel = fuel;
tmpa->timer = timer;
tmpa->next = NULL;
tmpaprev->next = tmpa;
}
else
{
err = 1;
}
}
}
}
}
}
}
fclose (fp);
}
return base;
}
/* main.c */
#include "prog.h"
int main (void)
{
t_base *handleprog = readfile ("data.txt");
/* structure de base pour decollage */
typedef struct s_basedeco
{
/* liste chainee vers strucuture contenant l'ensemble des avions
* decollants */
t_deco *ls;
/* liste chainee vers les avions a traiter */
t_deco *actual;
/* nombre d'avions decollant ou decolle dans la liste */
unsigned long nb;
/* nombre d'avion ayant decoller */
unsigned long nbtooken;
/* retard total */
unsigned long late;
}
t_basedeco;
/* Strucuture decollage pour fichier */
typedef struct s_fdeco
{
char numfly[5];
unsigned long time;
unsigned long timer;
struct s_fdeco *next;
}
t_fdeco;
/* structure atterissage */
typedef struct s_atter
{
char numfly[5];
long fuel;
long conso;
unsigned long time;
int etat;
struct s_atter *next;
}
t_atter;
/* structure de base pour aterissage */
typedef struct s_baseatter
{
t_atter *insky; /* avion dans le ciel */
t_atter *onearth; /* Avion crashes ou ayant atteri */
t_atter *lastonearth; /* Dernier element de onearth */
unsigned long nb; /* nombre d'avions dans la liste */
unsigned long nbonearth; /* nombre d'avions atteris */
unsigned long nbcrash; /* nombre d'avions crashe */
unsigned long nbemergency; /* nombre d'avions atteri en urgence */
}
t_baseatter;
/* structure atterissage pour fichier */
typedef struct s_fatter
{
char numfly[5];
long fuel;
long conso;
unsigned long timer;
struct s_fatter *next;
}
t_fatter;
J'ai repris l'ensemble du code, et je l'ai mis en forme. J'ai ajouté un petit code de test (il manque une fonction de destruction).
Remarques générales:
1 - Eviter les affectations dans les tests. Ca rend le code difficile à lire, et on se demande si tu n'as pas confondu '=' avec '=='.
2 - Simplifier l'utilisation de malloc() au strict nécessaire :
type_s *p = malloc (sizeof *p);
Ca allège l'écriture et la lecture.
3 - Définir les variables là où on en a besoin. Ca rend le code plus facile à lire et à vérifier, ça le prépare au découpage en fonctions.
4 - Soigner l'indentation
5 - Eviter les accentuées (pas de normalisation)
6 - Eviter les commentaires '//'. Il ne sont pas supportés en C90.
7 - Il est d'usage, pour être fair play avec les anciens systèmes, que les noms de fichiers ne dépasse pas le format 8.3 (C'est ce que fait le langage C avec ses headers)
8 - Les noms des fichiers et le découpage ne sont pas un modèle de clarté!
9 - Eviter les lignes de plus de 76 colonnes.
10 - Il manque la définition du format du fichier de donnees.
/* Projet: Gestionnaire d'Aeroport Fichier: programmation.c Date: Novembre-Decembre 2003 Auteur: - Info: fonction permettant de recuperer les donnees d'un fichier texte */
/* on lit le fichier, et on on trouve chaque mot */ while ((fscanf (fp, "%s", buffer) == 1) && !err) { /* on regarde si c une inscritpion temporelle */ if (strlen (buffer) == 2) { if (atoi (buffer)) { if (timer < (unsigned long) atoi (buffer)) timer = (unsigned long) atoi (buffer); } } else if (strlen (buffer) == 12) { if (buffer[0] == 'D') /* classement des evenements par categories */ { char tmp3[3]; char nom[5]; /* on recupere le vol */ strncpy (nom, &buffer[8], 4); nom[4] = ' '; /* on recupere l'heure */ strncpy (tmp3, &buffer[6], 2); tmp3[2] = ' ';
time = atoi (tmp3); if (time != 0) { /* on regarde si on ajoute pas un avion qui devrait deja avoir decolle */ if (timer <= time) { t_fdeco *tmpd; /* on ajoute dans la liste chainee */ if (pdeco == NULL) { /* on le fait considerer comme le premier element; */ tmpd = malloc (sizeof *tmpd);
if (tmpd != NULL) { pdeco = tmpd; base->deco = pdeco; /* on met les donnees */ strcpy (tmpd->numfly, nom); tmpd->time = time; tmpd->timer = timer; tmpd->next = NULL; } else { err = 1; } } else { t_fdeco *tmpdprev; tmpdprev = tmpd; tmpd = malloc (sizeof *tmpd); if (tmpd != NULL) { /* on met les donnees */ strcpy (tmpd->numfly, nom); tmpd->time = time; tmpd->timer = timer; tmpd->next = NULL; tmpdprev->next = tmpd; } else { err = 1; } } } } } else if (buffer[0] == 'A') { char tmpfuel[4]; char tmp3[3]; char nom[5]; long fuel; long conso; /* on recupere le vol */ strncpy (nom, &buffer[8], 4); nom[4] = ' '; /* on recupere l'essence */ strncpy (tmpfuel, &buffer[1], 3); tmpfuel[3] = ' '; /* on recupere la conso */ strncpy (tmp3, &buffer[4], 2); tmp3[2] = ' '; fuel = atoi (tmpfuel); conso = atoi (tmp3); if (fuel != 0 && conso != 0) { t_fatter *tmpa; /* on ajoute dans la liste chainee */ if (patter == NULL) { /* on le fait considerer comme le premier element; */ tmpa = malloc (sizeof *tmpa); if (tmpa) { patter = tmpa; base->atter = patter; /* on met les donnees */ strcpy (tmpa->numfly, nom); tmpa->conso = conso; tmpa->fuel = fuel; tmpa->timer = timer; tmpa->next = NULL; } else { err = 1; } } else { t_fatter *tmpaprev; tmpaprev = tmpa; tmpa = malloc (sizeof *tmpa); if (tmpa) { /* on met les donnees */ strcpy (tmpa->numfly, nom); tmpa->conso = conso; tmpa->fuel = fuel; tmpa->timer = timer; tmpa->next = NULL; tmpaprev->next = tmpa; } else { err = 1; } } } } } } } fclose (fp); } return base; }
/* main.c */ #include "prog.h"
int main (void) { t_base *handleprog = readfile ("data.txt");
/* structure de base pour decollage */ typedef struct s_basedeco { /* liste chainee vers strucuture contenant l'ensemble des avions * decollants */ t_deco *ls;
/* liste chainee vers les avions a traiter */ t_deco *actual;
/* nombre d'avions decollant ou decolle dans la liste */ unsigned long nb;
/* nombre d'avion ayant decoller */ unsigned long nbtooken;
/* retard total */ unsigned long late; } t_basedeco;
/* Strucuture decollage pour fichier */ typedef struct s_fdeco { char numfly[5]; unsigned long time; unsigned long timer; struct s_fdeco *next; } t_fdeco;
/* structure atterissage */ typedef struct s_atter { char numfly[5]; long fuel; long conso; unsigned long time; int etat; struct s_atter *next; } t_atter;
/* structure de base pour aterissage */ typedef struct s_baseatter { t_atter *insky; /* avion dans le ciel */ t_atter *onearth; /* Avion crashes ou ayant atteri */ t_atter *lastonearth; /* Dernier element de onearth */ unsigned long nb; /* nombre d'avions dans la liste */ unsigned long nbonearth; /* nombre d'avions atteris */ unsigned long nbcrash; /* nombre d'avions crashe */ unsigned long nbemergency; /* nombre d'avions atteri en urgence */ } t_baseatter;
/* structure atterissage pour fichier */ typedef struct s_fatter { char numfly[5]; long fuel; long conso; unsigned long timer; struct s_fatter *next; } t_fatter;