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 :

Fichier Binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut Fichier Binaire
    Salut à tous ,

    J'ai un probleme avec une structure de donnée que je voudrais afficher !!

    Je travail avec un fichier binaire (.dat) , j'arrive à mettre à jour ma table constemment et a rajouter les nouvelles données dans mon fichier, je parviens également à ouvrir mon fichier en lecture mais je ne sais aps comment procéder pour qu'il m'affiche le contenu !!! et par cons"quent que je puisse accéder à mes données sauvées ... voilà une partie du 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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     int open_file (FILE *f)
     
    {
     
       f=fopen("c:\\exo1","rb");
     
     
     
     if (!f)
    	  { return 1; }
     
      else    { return 0; }
     
     }
     
     
    //**************************************************
     
    void charger_fichier()
     
    {  FILE *f=0;
       int i =0;
       unsigned int test;
       clrscr();
       struct etudiants tab1[25];
       printf(" *********************   AFFICHAGE DES ETUDIANTS *********************\n\n\n\n");
     
        if(!open_file(f))
     
         {
          while(!feof(f))
     
     
    	{ test=fread(&tab1,sizeof(struct etudiants),25,f);
     
    	    if (test!=0)
    		 {
     
    		   printf(" matricule %d  \n",tab1[i].matr);
    		   printf(" Mr/Mme %s \n",tab1[i].name);
     
    		   i++;
     
       		   getch();
    		  }
     
     
     
    	     else { printf(" erreur … la lecture du fichier \n");
    		    getch();
    		  }
     
    	}
     
     
     }
        else {  printf(" erreur de chargement du fichier ");
    	    getch();
    	 }
     
    fprintf(f," FICHIER DE SAUVEGARDE \n\n");
    	getch();
     
     
    fclose(f);
     
    }
    //*****************************************************************
    int save_bin ()
     
     {
         clrscr();
     
         FILE *f;
         int i=0;
     
         f=fopen("c:\\exo1","ab");
     
         if (!f)
    	   { printf(" error file opening \n");
    	     getch();
    	   }
     
         else
     
    	   {
    	      fwrite(tab,sizeof(struct etudiants),1,f);
    	      i++;
     
    	   }
     
    	   fwrite(&t1,sizeof(struct brol),1,f); // sauvegarde du compteur
    	   clrscr();
     
     
         printf(" \n\n\n               Fichier sauvegard‚ .");
     
     
         fclose(f);
         getch();
     
         clrscr();
         return 0;
     }
     
    // ************************************************

    Je pense que le probleme vient de la fonction "charger_fichier"

    Merci d'y jeter un coup d'oeil .

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Problème de pointeur : tu passes le pointeur f alors qu'il faut passer son adresse si tu veux que la modification soit prise en compte.
    Deux possibilités

    Possibilité 1
    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
    int open_file (FILE **f)
     
    {
     
      *f=fopen("c:\\exo1","rb");
     
     
     
     if (!(*f))
         { return 1; }
     
      else    { return 0; }
     
     } 
    appel par 
    if(!open_file(&f))
    Possibilité 2 meilleure à mon sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FILE *open_file(char *file)
    {
     
      return fopen(file,"rb");
    }
     
    appel par 
     f= open_file("c:\\exo1");
     if (f != NULL)
     {
     }
     else
     {
     }
    Au vu de ce deuxième bout de code, on peut se poser la question "A quoi sert vraiment cette fonction ?"
    Et je réponds "A rien"
    Autant faire directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void charger_fichier() 
    {
     
    {  FILE *f=0;
       int i =0;
       unsigned int test;
       clrscr();
       struct etudiants tab1[25];
       printf(" *********************   AFFICHAGE DES ETUDIANTS *********************\n\n\n\n");
     
        if((f = fopen("c:\\exo1", 'rb")) != NULL)
    C'est plus clair !
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Problème de pointeur : tu passe le pointeur f alors qu'il faut passer son adresse si tu veux que la modification soit prise en compte.
    Les modifs sont prises en compte, là n'est pas le problème , je voudrais pouvoir afficher le contenu de mon fichier à l'écran apres l'avoir charger en mémoire ( enn mode lecture) et aussi accéder à mes données .(par exemple si je veux supprimer un étudiant et toutes les données correspondantes à celui-ci . ...


    P.s: Pour le open_file c vrai qu'elle sert à rien , sans doute trop plongé dans mon code pour m'en aperçevoir ...

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu n'as pas compris ce que je voulais dire pour les modifs
    quand tu fais open_file(f) avec f= 0 , eh bien, teste si tu veux, f est encore égal à 0 après, ton fichier est bien ouvert, mais f ne contient pas le descripteur, c'est une des bases du C, le passage par valeur, si tu veux une modif de f, il faut passer son adresse.
    Je commente un peu ton 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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    void charger_fichier()
    {  FILE *f=0;
       int i =0;
       unsigned int test;
       clrscr();
       struct etudiants tab1[25];
       printf(" *********************   AFFICHAGE DES ETUDIANTS *********************\n\n\n\n");
     
        if(!open_file(f))
     
         {
         // feof(f) ne fait pas ce que tu crois, il faut lire les docs
         // en tout cas pour lire les enregistrements du fichier il faut procéder autrment
          while(!feof(f))
     
          // ici tu lis TOUTE la table, donc une seule lecture
       { test=fread(&tab1,sizeof(struct etudiants),25,f);
     
           if (test!=0)
           {
             // tu as tout lu, tu affiches le premier enregistrement
             // ton programme n'est pas cohérent.
             printf(" matricule %d  \n",tab1[i].matr);
             printf(" Mr/Mme %s \n",tab1[i].name);
     
             i++;
     
                getch();
            }
     
     
            // Pourquoi erreur de lecture ?
            // tu as peut-être simplement tout lu ?
            else { printf(" erreur … la lecture du fichier \n");
              getch();
            }
     
       }
     
     
     }
        else {  printf(" erreur de chargement du fichier ");
           getch();
        }
     
    fprintf(f," FICHIER DE SAUVEGARDE \n\n");
       getch();
     
    // fclose ne doit être fait que si le fichier a été ouvert
    // ce qui n'a pas été forcément fait ici .
    fclose(f);
     
    }
     
     
    // version "corrigée"
    //***************************************************************** 
    void charger_fichier()
    {  FILE *f=0;
       int i =0;
       unsigned int test;
       clrscr();
       struct etudiants tab1[25];
       printf(" *********************   AFFICHAGE DES ETUDIANTS *********************\n\n\n\n");
     
        if((f = fopen("c:\\exo1", "rb")) != NULL)
        {
          // une précaution, on ne sait jamais 25 peut-être trop petit
         // on lit étudiant par étudiant
          while(i < 25 && (test=fread(&tab1[i],sizeof(struct etudiants),1,f)) > 0)
          {
             printf(" matricule %d  \n",tab1[i].matr);
             printf(" Mr/Mme %s \n",tab1[i].name);
             i++;
             getch();
           }
           fclose(f);
     
        }
        else 
       {  printf(" erreur de chargement du fichier ");
           getch();
        }
     
    fprintf(f," FICHIER DE SAUVEGARDE \n\n");
       getch();
     
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Fichier Binaire
    Citation Envoyé par issou
    voilà une partie du code :
    Merci de poster du code compilable.
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    ../main.c:16: error: syntax error before '*' token
    ../main.c:18: warning: function declaration isn't a prototype
    ../main.c: In function `open_file':
    ../main.c:20: error: `f' undeclared (first use in this function)
    ../main.c:20: error: (Each undeclared identifier is reported only once
    ../main.c:20: error: for each function it appears in.)
    ../main.c:20: error: implicit declaration of function `fopen'
    ../main.c:20: warning: nested extern declaration of `fopen'
     
    ../main.c: At top level:
    ../main.c:36: warning: function declaration isn't a prototype
    ../main.c: In function `charger_fichier':
    ../main.c:36: error: `FILE' undeclared (first use in this function)
    ../main.c:36: error: `f' undeclared (first use in this function)
    ../main.c:39: error: implicit declaration of function `clrscr'
    ../main.c:39: warning: nested extern declaration of `clrscr'
    ../main.c:40: error: storage size of 'tab1' isn't known
    ../main.c:41: error: implicit declaration of function `printf'
    ../main.c:41: warning: nested extern declaration of `printf'
     
    <internal>:0: warning: redundant redeclaration of 'printf'
     
    ../main.c:46: error: implicit declaration of function `feof'
     
    ../main.c:46: warning: nested extern declaration of `feof'
    ../main.c:49: error: implicit declaration of function `fread'
    ../main.c:49: warning: nested extern declaration of `fread'
    ../main.c:49: error: invalid application of `sizeof' to incomplete type `etudiants' 
    ../main.c:59: error: implicit declaration of function `getch'
    ../main.c:59: warning: nested extern declaration of `getch'
    ../main.c:65: warning: nested extern declaration of `getch'
    ../main.c:59: warning: redundant redeclaration of 'getch'
    ../main.c:59: warning: previous implicit declaration of 'getch' was here
    ../main.c:73: warning: nested extern declaration of `getch'
    ../main.c:59: warning: redundant redeclaration of 'getch'
    ../main.c:59: warning: previous implicit declaration of 'getch' was here
    ../main.c:76: error: implicit declaration of function `fprintf'
    ../main.c:76: warning: nested extern declaration of `fprintf'
    <internal>:0: warning: redundant redeclaration of 'fprintf'
    ../main.c:77: warning: nested extern declaration of `getch'
    ../main.c:59: warning: redundant redeclaration of 'getch'
    ../main.c:59: warning: previous implicit declaration of 'getch' was here
    ../main.c:80: error: implicit declaration of function `fclose'
    ../main.c:80: warning: nested extern declaration of `fclose'
    ../main.c:40: warning: unused variable `tab1'
     
    ../main.c: At top level:
    ../main.c:86: warning: function declaration isn't a prototype
    ../main.c: In function `save_bin':
    ../main.c:87: warning: nested extern declaration of `clrscr'
    ../main.c:39: warning: redundant redeclaration of 'clrscr'
    ../main.c:39: warning: previous implicit declaration of 'clrscr' was here
    ../main.c:89: error: `FILE' undeclared (first use in this function)
    ../main.c:89: error: `f' undeclared (first use in this function)
    ../main.c:92: warning: nested extern declaration of `fopen'
    ../main.c:20: warning: redundant redeclaration of 'fopen'
    ../main.c:20: warning: previous implicit declaration of 'fopen' was here
    ../main.c:95: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    ../main.c:96: warning: nested extern declaration of `getch'
    ../main.c:59: warning: redundant redeclaration of 'getch'
    ../main.c:59: warning: previous implicit declaration of 'getch' was here
    ../main.c:102: error: implicit declaration of function `fwrite'
    ../main.c:102: warning: nested extern declaration of `fwrite'
    <internal>:0: warning: redundant redeclaration of 'fwrite'
    ../main.c:102: error: `tab' undeclared (first use in this function)
    ../main.c:102: error: invalid application of `sizeof' to incomplete type `etudiants' 
    ../main.c:107: warning: nested extern declaration of `fwrite'
    <internal>:0: warning: redundant redeclaration of 'fwrite'
    ../main.c:107: error: `t1' undeclared (first use in this function)
    ../main.c:107: error: invalid application of `sizeof' to incomplete type `brol' 
     
    ../main.c:111: warning: nested extern declaration of `printf'
    <internal>:0: warning: redundant redeclaration of 'printf'
    ../main.c:114: warning: nested extern declaration of `fclose'
    ../main.c:80: warning: redundant redeclaration of 'fclose'
    ../main.c:80: warning: previous implicit declaration of 'fclose' was here
    ../main.c:115: warning: nested extern declaration of `getch'
    ../main.c:59: warning: redundant redeclaration of 'getch'
    ../main.c:59: warning: previous implicit declaration of 'getch' was here
    Ca me parait bien compliqué comme code.. Je partirais sur ces bases :
    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
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include <stdio.h>
     
    #define NELEM(a) (sizeof(a)/sizeof*(a))
    #define FNAME "c:\\exo1"
     
    struct etudiants
    {
       unsigned matr;
       char name[32];
    };
     
    /* ************************************************* */
    static void charger_fichier (struct etudiants *tab, size_t n)
    {
       FILE *f = fopen (FNAME, "rb");
     
       if (f != NULL)
       {
          size_t i;
          int test;
     
          printf ("AFFICHAGE DES ETUDIANTS (max %u)\n", (unsigned) n);
     
          for (i = 0, test = -1; i < n && test != 0; i++)
          {
             struct etudiants *p = tab + i;
     
             test = fread (p, sizeof *p, 1, f);
     
             printf ("test=%d\n", test);
     
             if (test != 0)
             {
                printf (" matricule %d\n", p->matr);
                printf (" Mr/Mme %s\n\n", p->name);
             }
          }
          fclose (f);
       }
       else
       {
          perror (FNAME);
       }
    }
     
    /* ***************************************************************** */
    static int save_bin (struct etudiants const *tab, size_t n)
    {
       FILE *f = fopen (FNAME, "wb");
     
       if (f != NULL)
       {
          size_t i;
     
          for (i = 0; i < n; i++)
          {
             fwrite (tab + i, sizeof *tab, 1, f);
          }
          fclose (f);
          printf (" \nFichier sauvegarde.\n");
       }
       else
       {
          perror (FNAME);
       }
     
       return 0;
    }
     
    /* ***************************************************************** */
    int main (void)
    {
       struct etudiants tab[] =
       {
          {123, "abc"},
          {456, "def"},
    #if 1
          {78, "gh"},
    #endif
       };
     
    #if 0
       remove (FNAME);
       save_bin (tab, NELEM (tab));
    #else
       charger_fichier (tab, NELEM (tab));
    #endif
     
       return 0;
    }

  6. #6
    Membre confirmé Avatar de issou
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    181
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2005
    Messages : 181
    Par défaut
    Pour trap D: Merci pour ce corrigé, je comprend maintenant ta permiere remarque

    Pour Emmanuel Delahaye : Chez moi ca compile !!?! , je plaisante, j'y veillerai à l'avenir merci .

Discussions similaires

  1. Afficher un fichier binaire sous Windows
    Par Atomikx dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 14/12/2004, 00h29
  2. [LG]ecriture dans un fichier binaire
    Par jsaviola dans le forum Langage
    Réponses: 3
    Dernier message: 26/12/2003, 17h30
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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