Chargement d1 fichier dan 1liste chainee en C

Résolu/Fermé
don1design Messages postés 72 Date d'inscription vendredi 4 juin 2010 Statut Membre Dernière intervention 4 septembre 2015 - 19 juil. 2010 à 08:56
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 20 juil. 2010 à 08:08
bonjour, tout monde

j'ai un fichier service.txt qui contient des infos comme suit

Impression_noir 10
Impression_couleur 25
Scannarisation 15
Plastification_Petite 20
Plastification_Grande 40
Reliure_Petit 30
Reliure_Grande 50

jaimerais charge chaque service plus son tarif dans une liste chainee.
jai ecrit le programme que jai compile avec code::blocks
qui ne me montre aucune erreur mais lorsque je lexecute il se plante
pourriez vous bien maider a trouver lerreur.

voici le code

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define TAILLE_MAX 100

//les prototypes
int calculNbrDeService();
void chargement();
void affichage();

//les variables globales
int qtyService=0, i;
//services service[qtyService];


//Declaration de la structure SERVICE
typedef struct services services;
struct services
{
char type[50];
int tarif;

struct services *precedent;
struct services *suivant;
};

//Declation et initialisation de variable structuree
services *debut=NULL;
services *fin=NULL;
services *nouveau;
services *courant;

//FONCTION principale
int main()
{
int calculNbrDeService();

printf("Le nombre de service est ");

qtyService = calculNbrDeService();

printf("%d", qtyService);
printf("\nLes service sont\n");

chargement();
affichage();

return 0;
}

//Calcul du nombre de services disponible
int calculNbrDeService()
{
int nbrService=0;

FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";

fichier = fopen("service.txt", "r");

if (fichier != NULL)
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier au complet
{
nbrService++; //augmentation du nombre de service
}
fclose(fichier);
}
return nbrService;
}

//CHARGEMENT des services dans la liste chainee
void chargement()
{
//CREATION du pointeur FILE
FILE* fichier = NULL;
char ttype[50];
int ttarif;

//OUVERTURE du fichier service.txt
fichier = fopen("service.txt", "r");

//Allocation d. de memoire
nouveau=(services*)malloc(sizeof(services));
if(nouveau!=NULL)
{

for ( i=0 ; i<qtyService ; i++ )
{
fscanf(fichier, "%s %d\n", ttype, &ttarif);
nouveau->type[0]=&ttype[0];
nouveau->tarif=ttarif;
nouveau->precedent=NULL;
nouveau->suivant=debut;
debut->precedent=nouveau;
debut=nouveau;
}
}
fclose(fichier);
}

//Affichage de la liste
void affichage()
{
courant=debut;//Point de depart
while(courant!=NULL)
{
printf("%s %d", courant->type, courant->tarif);
courant=courant->suivant;
}
getch();
}
A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
19 juil. 2010 à 09:44
for ( i=0 ; i<qtyService ; i++ )
{
  fscanf(fichier, "%s %d\n", ttype, &ttarif);
  nouveau->type[0]=&ttype[0];
  nouveau->tarif=ttarif;
  nouveau->precedent=NULL;
  nouveau->suivant=debut;
  debut->precedent=nouveau;
  debut=nouveau;
} 

Voici, je pense une partie des problèmes.
cette ligne là ne veux rien dire : "nouveau->type[0]=&ttype[0];" tu fais char=char*, ça passe à la compilation par je ne sais quel miracle, il devrait y avoir au moins un warning.
ensuite, tu utilises debut et notamment debut->precedent alors que debut ne pointe sur rien (lors de la première boucle) donc erreur.
1
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
20 juil. 2010 à 08:08
J'ai un peu de mal à comprendre la logique de ta liste chainée et des variables.
pour moi début (dans mon esprit) doit être un pointeur qui pointe sur le premier élement de la liste. Donc, plutôt :
if (taille!=0 || taille==0)// en fait, le cas vide ezst un cas spécial en dehors de la boucle
{
for ( i=0 ; i<qtyService ; i++ )
{
nouveau=(services*)malloc(sizeof(services)); 
fscanf(fichier, "%s %d\n", &nouveau->type, &nouveau->tarif);
nouveau->suivant=0;
if(debut==0) {debut=fin=nouveau;nouveau->precedent=0;}
else
{
   nouveau->precedent=fin;
   fin->suivant=nouveau;
   fin=fin->suivant;// identique à fin=nouveau, mais pour la logique je préfère  ainsi
   taille++;
}
}
}

après, tu veux peut-être construire ta liste à l'envers en FILO ? mais du coup, ce n'est pas cohérent avec ton affichage et le reste.
En fait, ta plus grosse erreur, c'est de ne pas renouveller nouveau dans la boucle. Du coup, tu l'efface à chaque fois. Attention, tu travail avec des pointeurs !Le but des listes chainées, c'est d'avoir beaucoup de données mais très peu de variable. Il faut donc faire plus de malloc qu'il y a de variables.
1
don1design Messages postés 72 Date d'inscription vendredi 4 juin 2010 Statut Membre Dernière intervention 4 septembre 2015
19 juil. 2010 à 18:24
jy ai porte une correction
en ajoutan un fonction quand la liste est vice mais arrive a l'affichage de la liste
je recois queque chose que je ne comprends pas

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define TAILLE_MAX 100

//les prototypes
int calculNbrDeService();
void chargement();
void affichage();
void chargementSiVide();

//les variables globales
int qtyService=0, i, taille=0;
//services service[qtyService];


//Declaration de la structure SERVICE
typedef struct services services;
struct services
{
char type[50];
int tarif;

struct services *precedent;
struct services *suivant;
};

//Declation et initialisation de variable structuree
services *debut=NULL;
services *fin=NULL;
services *nouveau;
services *courant;

//FONCTION principale
int main()
{
int calculNbrDeService();

printf("Le nombre de service est ");

qtyService = calculNbrDeService();

printf("%d", qtyService);
printf("\nLes service sont\n");

chargementSiVide();
affichage();

return 0;
}

//Calcul du nombre de services disponible
int calculNbrDeService()
{
int nbrService=0;

FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";

fichier = fopen("service.txt", "r");

if (fichier != NULL)
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier au complet
{
nbrService++; //augmentation du nombre de service
}
fclose(fichier);
}
return nbrService;
}

//CHARGEMENT des services dans la liste chainee
void chargement()
{
//CREATION du pointeur FILE
FILE* fichier = NULL;
char ttype[50];
int ttarif;

//OUVERTURE du fichier service.txt
fichier = fopen("service.txt", "r");

//Allocation d. de memoire
nouveau=(services*)malloc(sizeof(services));
if(nouveau!=NULL)
{
if (taille!=0)
{
for ( i=0 ; i<qtyService ; i++ )
{
fscanf(fichier, "%s %d\n", ttype, &ttarif);
nouveau->type[0]=ttype[0];
nouveau->tarif=ttarif;
nouveau->precedent=NULL;
nouveau->suivant=debut;
debut->precedent=nouveau;
debut=nouveau;
taille++;
}
}
else
chargementSiVide();
}
fclose(fichier);
}

//Chargement au debut
void chargementSiVide()
{
//CREATION du pointeur FILE
FILE* fichier = NULL;
char ttype[50];
int ttarif;

//OUVERTURE du fichier service.txt
fichier = fopen("service.txt", "r");

//Allocation d. de memoire
nouveau=(services*)malloc(sizeof(services));
if(nouveau!=NULL)
{
for ( i=0 ; i<qtyService ; i++ )
{
fscanf(fichier, "%s %d\n", ttype, &ttarif);
nouveau->type[0]=ttype[0];
nouveau->tarif=ttarif;
nouveau->precedent=debut;
nouveau->suivant=fin;
debut=nouveau;
fin=nouveau;
taille++;
}
}
}

//Affichage de la liste
void affichage()
{
courant=debut;//Point de depart
for ( i=0 ; i<qtyService ; i++)
{
printf("%s %d\n", courant->type, courant->tarif);
courant=courant->suivant;
}
getch();
}
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
Modifié par chuka le 19/07/2010 à 19:39
salut,
tu peux t'inspirer de cela:
void chargementSiVide(int nb)   
{   
//CREATION du pointeur FILE   
    FILE* fichier = NULL;   
    char ttype[50];   
    int ttarif;   

//OUVERTURE du fichier service.txt   
    fichier = fopen("c:\\temp\\service.txt", "r");   

//Allocation d. de memoire   
    services*precedent=NULL;   
    for ( i=0 ; i<nb ; i++ )   
    {   
        fscanf(fichier, "%s %d\n", ttype, &ttarif);   
        services*deb=(services*)malloc(sizeof(services));//cree une structure de type service   
        strcpy(&deb->type[0],&ttype[0]);//copie le resultat dans la struct   
        deb->tarif=ttarif;   
        if (i==0){   
            deb->precedent=NULL;//c'est le premier donc pas de precedent   
            debut=deb;//c'est le premier donc affectation de debut à cette adresse   
        }   
        else   
            deb->precedent=precedent;//sinon, il a precedent memorisé ci-dessous   

        deb->suivant=NULL;   
        if (precedent!=NULL)   
            precedent->suivant=deb;   
        precedent=deb;   
    }   
}   
void freeList()   
{   
   services*suivant;   
   while(debut!=NULL){   
       suivant=debut->suivant;   
       free(debut);   
       debut=suivant;   
   }   
    printf("It's free!!;)");   
}   
//Affichage de la liste   
void affichage()   
{   
    services*courant=debut;//Point de depart   
    while(courant!=NULL)   
    {   
        printf("%s %d\n", courant->type, courant->tarif);   
        courant=courant->suivant;   
    }   
    getchar();   
}   

j'espere ca pourra t'aider!!
@+
0
je viens de porter des corrections
jarrive a lire le fichier txt mais il ne lit que la derniere ligne
en depit du fait que jai mit le curseur au debut tu fichier
je ne lis que la derniere ligen

voic mon code

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>

#define TAILLE_MAX 100

//les prototypes
int calculNbrDeService();
void chargement();
void affichage();
void chargementSiVide();

//les variables globales
int qtyService=0, i=0, taille=0;
//services service[qtyService];


//Declaration de la structure SERVICE
typedef struct services services;
struct services
{
char type[50];
int tarif;

struct services *precedent;
struct services *suivant;
};

//Declation et initialisation de variable structuree
services *debut=NULL;
services *courant;
services *nouveau;
services *fin=NULL;

//FONCTION principale
int main()
{
int calculNbrDeService();

printf("Le nombre de service est ");

qtyService = calculNbrDeService();

printf("%d", qtyService);
printf("\n\nLes service sont\n");

chargement(qtyService);
affichage();

return 0;
}

//Calcul du nombre de services disponible
int calculNbrDeService()
{
int nbrService=0;

FILE* fichier = NULL;
char chaine[TAILLE_MAX] = "";

fichier = fopen("service.txt", "r");

if (fichier != NULL)
{
while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On lit le fichier au complet
{
nbrService++; //augmentation du nombre de service
}

fseek(fichier, 0, SEEK_SET);
fclose(fichier);
}
return nbrService;
}

//CHARGEMENT des services dans la liste chainee
void chargement()
{
//CREATION du pointeur FILE
FILE* fichier = NULL;

//OUVERTURE du fichier service.txt
fichier = fopen("service.txt", "r");
fseek(fichier, 0, SEEK_SET);

//Allocation d. de memoire
nouveau=(services*)malloc(sizeof(services));
if(nouveau!=NULL)
{
//chargement quand il y a deja des elements
if (taille!=0)
{
for ( i=0 ; i<qtyService ; i++ )
{
fscanf(fichier, "%s %d\n", &nouveau->type, &nouveau->tarif);
nouveau->precedent=NULL;
nouveau->suivant=debut;
debut->precedent=nouveau;
debut=nouveau;
taille++;
}
}
else
{
//chargementSiVide
for ( i=0 ; i<qtyService ; i++ )
{
fscanf(fichier, "%s %d\n", &nouveau->type, &nouveau->tarif);
nouveau->precedent=debut;
nouveau->suivant=fin;
debut=nouveau;
fin=nouveau;
taille++;
}
}
}
fclose(fichier);
}

//Affichage de la liste
void affichage()
{
courant=debut;//Point de depart
for ( i=0 ; i<qtyService ; i++)
{
printf("%d.- %s %d\n", i, courant->type, courant->tarif);
courant=courant->suivant;
}
getch();
}


void freeList()
{
services*suivant;
while(debut!=NULL)
{
suivant=debut->suivant;
free(debut);
debut=suivant;
}
printf("It's free!!;)");
}
0