Chargement d1 fichier dan 1liste chainee en C
Résolu
don1design
Messages postés
72
Date d'inscription
Statut
Membre
Dernière intervention
-
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
Char Snipeur Messages postés 9813 Date d'inscription Statut Contributeur Dernière intervention -
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();
}
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:
- Chargement d1 fichier dan 1liste chainee en C
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
4 réponses
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.
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 :
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.
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.
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();
}
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();
}
salut,
tu peux t'inspirer de cela:
j'espere ca pourra t'aider!!
@+
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!!
@+
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!!;)");
}
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!!;)");
}