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