Metre un fichier.txt dans une liste chainee

Fermé
don1design Messages postés 72 Date d'inscription vendredi 4 juin 2010 Statut Membre Dernière intervention 4 septembre 2015 - 20 juil. 2010 à 07:00
 François - 21 juil. 2010 à 09:46
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
mias je narrive cas reconnaitre la dernier ligen du fichier txt

voici 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");

//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++ )
{
//fgets(chaine, TAILLE_MAX, fichier);
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++ )
{
//fgets(chaine, TAILLE_MAX, fichier);
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();
}
A voir également:

3 réponses

salut,

petite question pour situer le pb : où se situe le décalage :
est-ce que le nbrService calculé est correct ?
quand tu affiche ta liste chainee, les premiers élements sont correct ?
c'est l'affichage qui ne va pas jusqu'au bout, ou bien la création du dernier élément ?

A+
0
don1design Messages postés 72 Date d'inscription vendredi 4 juin 2010 Statut Membre Dernière intervention 4 septembre 2015
20 juil. 2010 à 16:28
oui le nombre de service est correct
lorsque j'affice la liste chainee
elle ne prend en contr que la derniere ligne de mon fichier.tx
et la met dans tout la chaine
0
Mr. D@RK Messages postés 26 Date d'inscription lundi 19 juillet 2010 Statut Membre Dernière intervention 16 octobre 2010 28
20 juil. 2010 à 18:40
D'abord, dans ton "prog" il n'y a pas de liste chainée! Je peux t'aider(en te livrant la correction), mais dis moi est-ce que tu veux à tt prix faire çà avec une liste chainée(il y a une autre méthode bcp plus efficace)

Cdlt,
0
Pourquoi tu simplifierai pas ton code en utilisant une liste chainée plutôt qu'une liste doublement chainée. A mon avis tu ajoute de la complexité inutilement.

voilà un bon tuto la dessus :
https://chgi.developpez.com/pile/

Bon courage.
0