IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Probleme avec le fwrite et les listes chainés


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Par défaut Probleme avec le fwrite et les listes chainés
    Bonjour , je suis actuellement de faire un programme permettant de gerer la gestion des stocks d'un magasin de composants electronique , ne connaissant pas le nombre de composant a l'avance , ni leur nom , fabricant , fonction et prix , je n'utilise AUCUN tableau mais plutot des listes chainé.
    Voila comment j'enregistre ces quatres renseigments dans une liste chainé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <malloc.h>
     
    struct composant{ char NOM[20];
    				  char FABRICANT[20];
    				  char FONCTION[100];
    				  float PRIX;
    				  composant *adresse;
    				};
     
    struct composant *ter;
    composant InsertionEnAd(char Inom[20],char Ifabricant[20],char Ifonction[100],float Iprix,struct composant *adsuivante);
    composant InsertionEnAd(char Inom[20],char Ifabricant[20],char Ifonction[100],float Iprix,struct composant *adsuivante)
    {
    	struct composant *ad;
    	ad = (struct composant *)malloc (sizeof(struct composant)); // on force le type de retour en adresse avec
    	if (ad!=NULL)												// (struct wagon *)
    	{															// calcul du nbr d'octect d'1 wagon : sizeof(struct wagon)
    		strcpy((*ad).NOM , Inom);
    		strcpy((*ad).FABRICANT , Ifabricant);
    		strcpy((*ad).FONCTION , Ifonction);
    		(*ad).PRIX , Iprix;
    		//(*ad).adresse = adsuivante;
    		//adsuivante = ad;
    		ter = ad;
    		//printf("%s %s %s %f",ad->NOM,ad->FABRICANT,ad->FONCTION,ad->PRIX);
    	}
    	return *ad;
    }
     
    void main(void)
    {
    	int n=0;
    	int choix;
     
    	char Snom[20];
    	char Sfabricant[20];
    	char Sfonction[100];
    	float Sprix;
     
            printf("Saisir Nom du composant\n");
    	scanf("%s",&Snom);
    	printf("Saisir Fabricant du composant\n");
    	scanf("%s",&Sfabricant);
    	printf("Saisir Fonction du composant\n");
    	scanf("%s",&Sfonction);
    	printf("Saisir Prix du composant\n");
    	scanf("%f",&Sprix);
    	InsertionEnAd(Snom,Sfabricant,Sfonction,Sprix,ter);
     
    getch()
    }
    Une fois cela fais , il faudrait que je puisse enregistrer cette liste chainé , pour cela j'utilise ma fonction Sauvegarder() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void Sauvegarder(struct composant *Sad);
    void Sauvegarder(struct composant *Sad)
    {
    	FILE *Fich;
    	int fermer;
     
    	/* Ouverture pour ecriture */
    	if((Fich = fopen( "c:\\fichier.txt", "w+" )) == NULL )
    		printf( "Le Fichier na pas pu etre ouvert\n" );
        else
    	{
    		printf( "Le Fichier est ouvert\n" );
    		/* Ecriture */
    		fwrite(Sad->NOM, sizeof(char), 20, Fich);
    		fwrite(Sad->FABRICANT, sizeof(char), 20, Fich);
    		fwrite(Sad->FONCTION, sizeof(char), 100, Fich);
    		//fwrite(Sad->PRIX, sizeof(float), 20, Fich);
    	}
        fermer = _fcloseall();
    	fclose(Fich);
    	if(fermer>0)
    		printf( "Fichier Fermer");
    	else
    		printf( "Fichier NON Fermer");
    }
    Le fichier c:\fichier.txt est bien créé mais voila ce qu'il contient :
    敲楳瑳湡散촀췍췍췍췍楳浥湥s췍췍췍췍췍췍档污略r췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍
    enfin , il contient un peu n'importe quoi...

    donc si vous voyez d'ou mon probléme vient , j'aprécierez bcp votre aide.

    Amicalement lucas
    Ami programmeur

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    fwrite écrit en binaire...

    si tu veux écrire en texte, c'est fprintf....

  3. #3
    Membre éclairé Avatar de Lucas42
    Inscrit en
    Janvier 2006
    Messages
    301
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 301
    Par défaut
    Merci bien , je clos le sujet

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Lucas42 Voir le message
    Bonjour , je suis actuellement de faire un programme permettant de gerer la gestion des stocks d'un magasin de composants electronique , ne connaissant pas le nombre de composant a l'avance , ni leur nom , fabricant , fonction et prix , je n'utilise AUCUN tableau mais plutot des listes chainé.
    Voila comment j'enregistre ces quatres renseigments dans une liste chainé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <malloc.h>
     
    struct composant{ char NOM[20];
    				  char FABRICANT[20];
    				  char FONCTION[100];
    				  float PRIX;
    				  composant *adresse;
    				};
     
    struct composant *ter;
    composant InsertionEnAd(char Inom[20],char Ifabricant[20],char Ifonction[100],float Iprix,struct composant *adsuivante);
    composant InsertionEnAd(char Inom[20],char Ifabricant[20],char Ifonction[100],float Iprix,struct composant *adsuivante)
    {
    	struct composant *ad;
    	ad = (struct composant *)malloc (sizeof(struct composant)); // on force le type de retour en adresse avec
    	if (ad!=NULL)												// (struct wagon *)
    	{															// calcul du nbr d'octect d'1 wagon : sizeof(struct wagon)
    		strcpy((*ad).NOM , Inom);
    		strcpy((*ad).FABRICANT , Ifabricant);
    		strcpy((*ad).FONCTION , Ifonction);
    		(*ad).PRIX , Iprix;
    		//(*ad).adresse = adsuivante;
    		//adsuivante = ad;
    		ter = ad;
    		//printf("%s %s %s %f",ad->NOM,ad->FABRICANT,ad->FONCTION,ad->PRIX);
    	}
    	return *ad;
    }
     
    void main(void)
    {
    	int n=0;
    	int choix;
     
    	char Snom[20];
    	char Sfabricant[20];
    	char Sfonction[100];
    	float Sprix;
     
            printf("Saisir Nom du composant\n");
    	scanf("%s",&Snom);
    	printf("Saisir Fabricant du composant\n");
    	scanf("%s",&Sfabricant);
    	printf("Saisir Fonction du composant\n");
    	scanf("%s",&Sfonction);
    	printf("Saisir Prix du composant\n");
    	scanf("%f",&Sprix);
    	InsertionEnAd(Snom,Sfabricant,Sfonction,Sprix,ter);
     
    getch()
    }
    Une fois cela fais , il faudrait que je puisse enregistrer cette liste chainé , pour cela j'utilise ma fonction Sauvegarder() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    void Sauvegarder(struct composant *Sad);
    void Sauvegarder(struct composant *Sad)
    {
    	FILE *Fich;
    	int fermer;
     
    	/* Ouverture pour ecriture */
    	if((Fich = fopen( "c:\\fichier.txt", "w+" )) == NULL )
    		printf( "Le Fichier na pas pu etre ouvert\n" );
        else
    	{
    		printf( "Le Fichier est ouvert\n" );
    		/* Ecriture */
    		fwrite(Sad->NOM, sizeof(char), 20, Fich);
    		fwrite(Sad->FABRICANT, sizeof(char), 20, Fich);
    		fwrite(Sad->FONCTION, sizeof(char), 100, Fich);
    		//fwrite(Sad->PRIX, sizeof(float), 20, Fich);
    	}
        fermer = _fcloseall();
    	fclose(Fich);
    	if(fermer>0)
    		printf( "Fichier Fermer");
    	else
    		printf( "Fichier NON Fermer");
    }
    Le fichier c:\fichier.txt est bien créé mais voila ce qu'il contient :

    enfin , il contient un peu n'importe quoi...
    As-tu fait des printf() de tes infos voir si leur valeur est correcte ? Parce que à vue de nez, ta fonction "Sauvegarder()" semble bonne (du moins en ce qui concerne les chaînes parce que pour les float tu auras des soucis mais c'est en commentaire). Juste éviter de faire un "fclose(Fich)" dans le cas où le fichier n'a pas été ouvert. Et je vois pas à quoi sert "_fcloseall()" mais ça doit être un truc spécifique zindow. Donc il est probable que c'est lors de l'appel de la fonction qu'il y a un blem (tu dois pas lui passer le bon pointeur mais comme j'ai pas trouvé l'endroit où c'était appelé...)

    Sinon diverses remarques
    - "(*ad).NOM" peut s'écrire plus simplement "ad->Nom"
    - evite de renvoyer une structure complète (return *ad) => si ta structure fait 8Go de taille, t'auras 8Go qui seront inutilement copiés entre 2 zones mémoires => renvoie plutôt un pointeur sur ta structure (return ad) => quelle que soit la taille de ta structure, un pointeur fait toujours 4 octets...

    Citation Envoyé par souviron34 Voir le message
    fwrite écrit en binaire...

    si tu veux écrire en texte, c'est fprintf....
    Evidemment !!! J'ai même pas tilté !!!
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. petit problème avec les listes chainées
    Par djinpark1 dans le forum Débuter
    Réponses: 4
    Dernier message: 30/06/2009, 17h11
  2. programmation avec les listes chainées
    Par rufa11 dans le forum Gnome
    Réponses: 0
    Dernier message: 11/02/2009, 07h08
  3. difficulté avec les listes chainées
    Par sneb5757 dans le forum Débuter
    Réponses: 3
    Dernier message: 30/09/2008, 09h34
  4. Problème avec les listes chainées
    Par reeda dans le forum C++
    Réponses: 10
    Dernier message: 23/04/2008, 16h21
  5. Réponses: 2
    Dernier message: 10/10/2005, 02h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo