| 12
 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;
} | 
Partager