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
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
A voir également:
- Chargement d1 fichier dan 1liste chainee en C
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier host - Guide
- Ouvrir fichier .bin - Guide
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
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.
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
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 :
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.
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
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();
}
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();
}
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
Modifié par chuka le 19/07/2010 à 19:39
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!!;)");
}