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 :

fwrite et structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 32
    Par défaut fwrite et structure
    Bonjour

    J'ai le code suivant :
    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
    #include <stdio.h>
     
    #include <string.h>
     
    #include <stdlib.h>
     
    #define LGNOM 20                    /* longueur maxi d'un nom */
     
    #define NBENFMAX 15                 /* nombre maxi d'enfants */
     
    #define LNOMFICH 20                 /* longueur maxi nom de fichier */
     
     
     
    main()
     
    {  char nomfich [LNOMFICH+1] ;      /* nom du fichier à créer */
     
       FILE * sortie  ;                 /* descripteur fichier (niveau 2) */
     
       struct { char nom [LGNOM+1] ;
     
                int age ;               /* description d'un enregistrement */
     
                int nbenf ;                     /* du fichier */
     
                int agenf [NBENFMAX] ;
     
              } bloc ;
     
       int i ;
     
     
     
                 /* ouverture fichier à créer */
     
                 /* attention : mode d'ouverture w au lieu de wb dans certains cas */
     
       printf ("donnez le nom du fichier à créer : ") ;
     
       gets (nomfich) ;
     
       if ( (sortie = fopen (nomfich, "w")) == NULL )
     
          { printf ("***** erreur ouverture - abandon programme") ;
     
            exit(-1) ;
     
          }
     
     
     
                 /* création du fichier à partir d'informations */
     
                         /* fournies au clavier */
     
       printf ("----- pour terminer la saisie, donnez un nom 'vide' ---\n") ;
     
       do
     
          { printf ("nom             : ") ;                    /* saisie nom */
     
            gets (bloc.nom) ;
     
            if ( strlen(bloc.nom) == 0) break ; /* sortie boucle si nom vide */
     
            printf ("age             : ") ;
     
            scanf ("%d", &bloc.age) ;                          /* saisie age */
     
            printf ("nombre enfants  : ") ;
     
            scanf ("%d", &bloc.nbenf) ;                 /* saisie nb enfants */
     
            for (i=0 ; i < bloc.nbenf && i < NBENFMAX ; i++)
     
               { printf ("age enfant no %d : ", i+1) ;     /* saisie age des */
     
                 scanf ("%d", &bloc.agenf[i]) ;        /* différents enfants */
     
               }
     
            getchar() ;                                  /* pour éliminer \n */
     
            printf ("\n") ;
     
            fwrite (&bloc, sizeof(bloc), 1, sortie) ;    /* écriture fichier */
     
          }
     
       while (1) ;
     
     
     
                 /* fin création */
     
       fclose(sortie) ;
     
       printf ("\n -------- FIN CREATION FICHIER ----------") ;
     
    }
    et bien sur lol, j'ai un probleme : qd j'ouvre mon fichier creer : je trouve le nom de la personne en texte puis ensuite : des caracteres aleatoire non lisible :s.. Je suis un peu perdu la

    Avez vous trouvé mon erreur ?

    Merci pour votre aide

    PS : voici le resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    karim ÿÿ5bÏ   ¸™pƒ8          Tÿ þK4 @          €ÿ    €ÿ pÿ Úa4        „ÿ €ÿ ¸Ema m ÿÿ5bÏ   ¸™pƒ8            K4 @          €ÿ    €ÿ pÿ Úa4        „ÿ €ÿ ¸

  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
    ça t'arrive de lire la documentation avant de coder ????

    fwrite écrit en BINAIRE ....

    Pour écrire du texte, c'est fprintf....


  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 32
    Par défaut Question alors...
    Alors du coup je suis obligé de créer une fonction pour ecrire dans le fichier ?
    Apres avoir recuperer les valeurs .. n est ce pas ?

    merci

  4. #4
    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
    ben non...

    ça dépend de ce que tu veix faire....

    Tu peux écrire en texte, avec fprintf, comme tu le ferais à l'écran :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fprintf ( sortie, "Nom : %s  age %d  nbe d'enfants %d", bloc.nom,bloc.age, bloc.nbenf);
    if ( bloc.nbenf > 0 )
        for ( i = 0 ; i < bloc.nbenf )
                fprintf ( sortie, "Enfant %d  age %d", i, bloc.Ageenf[i]);
    fprintf ( sortie, "\n");

  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
    Citation Envoyé par souviron34 Voir le message
    ça t'arrive de lire la documentation avant de coder ????

    fwrite écrit en BINAIRE ....

    Pour écrire du texte, c'est fprintf....
    Euh, techniquement rien n'empêche d'écrire du texte dans un fichier texte ("w") avec fwrite(). C'est simplement pas vraiment adapté et ça ne fait pas conversion numérique -> texte comme peut le faire fprintf().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       char const *s = "Hello world\n";
     
       fwrite (s, 1, strlen (s), fp);
    c'est pas pire qu'un write() ou un send()...

  6. #6
    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
    Citation Envoyé par martini37 Voir le message
    J'ai le code suivant : <...> et bien sur lol, j'ai un probleme : qd j'ouvre mon fichier creer : je trouve le nom de la personne en texte puis ensuite : des caracteres aleatoire non lisible :s.. Je suis un peu perdu la

    Avez vous trouvé mon erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    karim ÿÿ5bÏ   ¸™pƒ8          Tÿ þK4 @          €ÿ    €ÿ pÿ Úa4        „ÿ €ÿ ¸Ema m ÿÿ5bÏ   ¸™pƒ8            K4 @          €ÿ    €ÿ pÿ Úa4        „ÿ €ÿ ¸
    Il n'y a pas d'erreur de codage, mais de conception. Lit mes commentaires :
    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
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    /* -ed- contient le prototype de fclean() */
    #include "fclean.h"
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    /* longueur maxi d'un nom */
    #define LGNOM 20
    /* nombre maxi d'enfants */
    #define NBENFMAX 15
    /* longueur maxi nom de fichier */
    #define LNOMFICH 20
     
    /* -ed- ajoute pour faire des saisies correctes (code minimum) : */
    void get_s (char *s, size_t size)
    {
       fgets (s, size, stdin);
     
    /* -ed- fclean() est une fonction que nous avons développé
     
       à l'intenton des programmeurs. Son code se trouve sur le forum...
       Utiliser l'outil de recherche... */
       fclean (s, stdin);
    }
     
    int get_i (void)
    {
       int i = 0;
       int n = 0;
       do
       {
          char s[32];
          fgets (s, sizeof s, stdin);
          fclean (s, stdin);
     
          n = sscanf (s, "%d", &i);
          if (n != 1)
          {
             puts ("erreur !");
          }
     
       }
       while (n != 1);
       return i;
    }
     
    /* -ed- ajoute int (obligatoire en C99)
    ajoute (void) : la forme 'prototypale' est hautement recommandee.
    Pas de parametre : (void) */
    int main (void)
    {
    /* nom du fichier à créer */
       char nomfich[LNOMFICH + 1];
    /* descripteur fichier (niveau 2) */
       FILE *sortie;
       struct
       {
          char nom[LGNOM + 1];
    /* description d'un enregistrement */
          int age;
    /* du fichier */
          int nbenf;
          int agenf[NBENFMAX];
       }
       bloc;
       int i;
    /* ouverture fichier à créer */
     
    /* attention : mode d'ouverture w au lieu de wb dans certains cas */
     
       printf ("donnez le nom du fichier à créer : ");
    /* -ed-
       gets (nomfich);
     
       cette fonction est un bug et ne doit pas etre utilisee.
    */
       get_s (nomfich, sizeof nomfich);
     
       if ((sortie = fopen (nomfich, "w")) == NULL)
       {
          printf ("***** erreur ouverture - abandon programme");
          exit (-1);
       }
    /* création du fichier à partir d'informations */
     
    /* fournies au clavier */
     
       printf ("----- pour terminer la saisie, donnez un nom 'vide' ---\n");
     
       do
       {
    /* saisie nom */
          printf ("nom             : ");
          get_s (bloc.nom, sizeof bloc.nom);
          if (strlen (bloc.nom) == 0)
    /* sortie boucle si nom vide */
             break;
          printf ("age             : ");
    /* saisie age */
    /* -ed-
          scanf ("%d", &bloc.age);
     
          scanf() est d'usage délicat...
          Une fonction plus solide est preferable...
          */
          bloc.age=get_i();
          printf ("nombre enfants  : ");
    /* saisie nb enfants */
          bloc.nbenf=get_i();
          for (i = 0; i < bloc.nbenf && i < NBENFMAX; i++)
          {
    /* saisie age des */
             printf ("age enfant no %d : ", i + 1);
    /* différents enfants */
             bloc.agenf[i]=get_i();
          }
    /* pour éliminer \n */
          getchar ();
          printf ("\n");
    /* écriture fichier */
     
    /* -ed- attention. Tu fais une ecriture directe des donnes sans encodage texte.
    Ce n'est pas portable. Il est recommandé d'utiliser un format texte,
    c'est ce qui est le plus simple et le plus portable. */
          fwrite (&bloc, sizeof (bloc), 1, sortie);
       }
       while (1);
    /* fin création */
     
       fclose (sortie);
       printf ("\n -------- FIN CREATION FICHIER ----------");
     
    /* -ed- obligatoire avant C99 */
     
       return 0;
    }

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

Discussions similaires

  1. [fwrite] tableau de structure ou cell array
    Par duflu dans le forum MATLAB
    Réponses: 1
    Dernier message: 21/05/2011, 13h57
  2. Réponses: 2
    Dernier message: 23/02/2009, 11h23
  3. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  4. fwrite et fread
    Par bohemianvirtual dans le forum C
    Réponses: 5
    Dernier message: 05/06/2002, 12h24
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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