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 :

Lire et écrire dans un fichier binaire


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut Lire et écrire dans un fichier binaire
    Mon programme remplis mal le fichier, lorsque j'essaye de le lire et le mettre dans un maillon, il me sort n'importe quoi!!!

    Voici mon code :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
     
    typedef struct Voiture        //Définition de la structure Voiture
    {
            char marque[20];
            char modele[20];
            char puissance[3];
            struct Voiture *suivant;
    }Voiture;
     
     
    void Creer (Voiture **p);
    void Ecrire (Voiture *p);
    void Lecture (void);
     
    int main(void)                 
    {      
     
          Voiture *tete=NULL;
    	  Creer (&tete);
    	  Ecrire(tete);
    	  Lecture();
    	  //system("cls");
    	 // printf("%s\n",tete->marque);
    	  //printf("%s\n",tete->suivant->marque);
          free(tete); tete=NULL; /* il faut liberer la memoire. C'est tres imporant */
    	  return EXIT_SUCCESS; 
     
     
     }
     
    void Creer (Voiture **p)        //Définition de la fonction Creer qui est de type Voiture
    {		
    		Voiture *voit=malloc(sizeof *voit);
    		if(voit != NULL)
    		{
    			printf("Entrez la marque :\n");
    			scanf("%s",&(voit->marque));
    			printf("Entrez le modele :\n");
    			scanf("%s",&(voit->modele));
    			printf("Entrez la puissance :\n");
    			scanf("%s",&(voit->puissance));
    			voit->suivant=*p;
    			*p=voit;
    		}        
    }
    void Ecrire(Voiture *p)
    {	
     
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "wb");
    	fwrite(p,sizeof(p),1, fic);
    	fclose(fic);
    	fic=NULL;
    }
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(voit),1,fic))
    	{
    		printf("%s,: %s : %s;",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    	fic=NULL;
    }

  2. #2
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Le second paramètre de fread() et fwrite() n'est pas bon, ce n'est pas la taille de la structure.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Salut,

    Dans la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Ecrire(Voiture *p)
    p est un pointeur... Il faut donc écrire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(p,sizeof(*p),1, fic);
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(p,sizeof(p),1, fic);
    et dans

    Essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fread(voit,sizeof(*voit),1,fic))
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(fread(voit,sizeof(voit),1,fic))
    Sinon, juste un truc, la bugati Veyron fait 1001chevaux, la puissance devrais plutot etre un char(4) ! lol

    Désolé si je dis n'importe quoi, ça fait longtemps que j'ai pas fait de C... mais de souvenir, c'est comme ça !

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    mince, jme suis fait grillé !! lol

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    J'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(Voiture),1,fic))
    	{
    		printf("%s,: %s : %s;",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    	fic=NULL;
    }
    et ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(*voit),1,fic))
    	{
    		printf("%s,: %s : %s;",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    	fic=NULL;
    }
    Et sa marche tjrs pas!!!

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par tinico
    Sinon, juste un truc, la bugati Veyron fait 1001chevaux, la puissance devrais plutot etre un char(4) ! lol
    En effet, car pour avoir "1001", il faut 5 cases dans un tableau de caractères...
    (un pour le '\0')

    Jc

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    change aussi le fwrite !

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    sa marche bien, la lecture s'affiche bien mais juste après ça bug, sa fait bugger windows!!!!!
    J'ai fais ça :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
     
    typedef struct Voiture        //Définition de la structure Voiture
    {
            char marque[20];
            char modele[20];
            char puissance[3];
            struct Voiture *suivant;
    }Voiture;
     
     
    void Creer (Voiture **p);
    void Ecrire (Voiture *p);
    void Lecture (void);
     
    int main(void)                 
    {      
     
          Voiture *tete=NULL;
    	  Creer (&tete);
    	  Ecrire(tete);
    	  Lecture();
    	  //system("cls");
    	 // printf("%s\n",tete->marque);
    	  //printf("%s\n",tete->suivant->marque);
          free(tete); tete=NULL; /* il faut liberer la memoire. C'est tres imporant */
    	  return EXIT_SUCCESS; 
     
     
     }
     
    void Creer (Voiture **p)        //Définition de la fonction Creer qui est de type Voiture
    {		
    		Voiture *voit=malloc(sizeof *voit);
    		if(voit != NULL)
    		{
    			printf("Entrez la marque :\n");
    			scanf("%s",&(voit->marque));
    			printf("Entrez le modele :\n");
    			scanf("%s",&(voit->modele));
    			printf("Entrez la puissance :\n");
    			scanf("%s",&(voit->puissance));
    			voit->suivant=*p;
    			*p=voit;
    		}        
    }
    void Ecrire(Voiture *p)
    {	
     
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "wb");
    	fwrite(p,sizeof(*p),1, fic);
    	fclose(fic);
    	fic=NULL;
    }
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(*voit),1,fic))
    	{
    		printf("%s,: %s : %s;",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    	fic=NULL;
    }

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Ha oui, c'est vrai... Oula, c'est loin, mais je m'en souvient oui !!!

  10. #10
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par poche
    sa marche bien, la lecture s'affiche bien mais juste après ça bug, sa fait bugger windows!!!!!
    Le malloc() dans la fonction de lecture n'est pas bon (mauvaise taille).

  11. #11
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Normal,

    Essaye ça dans la lecture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Voiture *voit=malloc(sizeof *voit);

  12. #12
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    OK Merci beaucoup!!!

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    J'ai un autre peti problème, c'est lorsque je fais plusieurs maillons, comment je fais pour les enregistrer, voila ce que j'ai fais :
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
     
     
    typedef struct Voiture        //Définition de la structure Voiture
    {
            char marque[20];
            char modele[20];
            char puissance[3];
            struct Voiture *suivant;
    }Voiture;
     
     
    void Creer (Voiture **p);
    void Ecrire (Voiture *p);
    void Lecture (void);
     
    int main(void)                 
    {      
     
          Voiture *tete=NULL;
    	  Creer (&tete);
    	  Creer (&tete);
    	  Ecrire(tete);
    	  Lecture();
    	  //system("cls");
    	 // printf("%s\n",tete->marque);
    	  //printf("%s\n",tete->suivant->marque);
          free(tete); tete=NULL; /* il faut liberer la memoire. C'est tres imporant */
    	  return EXIT_SUCCESS; 
     
     
     }
     
    void Creer (Voiture **p)        //Définition de la fonction Creer qui est de type Voiture
    {		
    		Voiture *voit=malloc(sizeof *voit);
    		if(voit != NULL)
    		{
    			printf("Entrez la marque :\n");
    			scanf("%s",&(voit->marque));
    			printf("Entrez le modele :\n");
    			scanf("%s",&(voit->modele));
    			printf("Entrez la puissance :\n");
    			scanf("%s",&(voit->puissance));
    			voit->suivant=*p;
    			*p=voit;
    		}        
    }
    void Ecrire(Voiture *p)
    {	
     
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "wb");
    	fwrite(p,sizeof(*p),2, fic);
    	fclose(fic);
    	fic=NULL;
    }
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof *voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(*voit),2,fic))
    	{
    		printf("%s, %s, %s/n",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    }
    ça s'arrète et sa bug windows!!!!
    j'ai mis en plus ds fread le paramètre 2, pour le nbre de maillons (je suis pas que c'est sa!!!)

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par poche
    ça s'arrète et sa bug windows!!!!
    j'ai mis en plus ds fread le paramètre 2, pour le nbre de maillons (je suis pas que c'est sa!!!)
    Il faut réfléchir un peu et ne pas programmer au hasard...

    Tu as une liste chaînée donc pour écrire dans ton fichier, faut parcourir la liste et écrire chaque élément séparément...

    Jc

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Soit tu utilise la glib (solution simple)
    Ou alors, tu fais une fontion "ajouterVoitureALaListe()"
    Une fonction qui créé une nouvelle voiture et qui la retourne et voila...

  16. #16
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    Le programme que je veux faire doit lire un fichier, mettre les infos dans des maillons, ensuite ajouter ou supprimer des maillons, pour enfin enregistrer mes changements dans ce fichier.
    La lecture se fais au début du programme et l'écriture à la fin du programme!!

  17. #17
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    J'ai fais ça, mais je ne sais pas comment mettre les infos du fichier texte dans le maillon!!!

    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 Ecrire(Voiture *p)
    {	
     
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "wb");
    	while(p!=NULL)
    	{
    		fprintf(fic,"%s %s %s /n",p->marque,p->modele,p->puissance);
    		p=p->suivant;
    	}
    	//fwrite(p,sizeof(*p),2, fic);
    	fclose(fic);
    	fic=NULL;
    }
    void Lecture (void)
    {	
    	Voiture *voit=malloc(sizeof *voit);
    	FILE *fic = NULL;
    	fic = fopen("c:\\test.txt", "rb");
    	while(fread(voit,sizeof(*voit),1,fic))
    	{
    		printf("%s, %s, %s/n",voit->marque,voit->modele,voit->puissance);
    	}
     
    	fclose(fic);
    }

  18. #18
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 52
    Points
    52
    Par défaut
    c'est bon j'ai trouvé!!
    Merci quand même pour votre aide...

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

Discussions similaires

  1. Lire et écrire dans un fichier binaire en VBScript
    Par David_Geek dans le forum VBScript
    Réponses: 0
    Dernier message: 28/08/2010, 14h06
  2. Réponses: 12
    Dernier message: 26/07/2006, 12h08
  3. lire et écrire dans un fichier
    Par karel dans le forum C
    Réponses: 15
    Dernier message: 18/01/2006, 17h24
  4. [FTP] Lire et écrire dans un fichier
    Par dj-julio dans le forum Langage
    Réponses: 49
    Dernier message: 12/01/2006, 11h59
  5. [Rech. Comp.] Lire et écrire dans des fichiers XML
    Par Rodrigue dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/08/2005, 20h48

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