Je viens de découvrir un bug dans ton code. Dans la fonction fecriture(), tu ecris :
Or, si on lit le main(), on voit que enreg est un tableau de 16 char, dont les indices valides vont de 0 à 15. Cette ligne constitue donc un comportement indéfini. Tout peut arriver.
Ce problème illustre le fait que l'interface de la fonction, que j'ai modifiée pour ne pas avoir de globales, est incomplet. Il manque en effet la taille du bloc, utilisée au moins 2 fois dans celle-ci.
Je propose donc d'écrire du code plus souple (et par la même occasion plus correct) de la façon suivante :
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
|
#include <stdio.h>
#include <stdlib.h>
/*****************************************************************************/
/*************************** FONCTION ECRITURE *******************************/
/*****************************************************************************/
void fecriture (FILE * sortie, char enreg[], size_t size, int count)
{
if (count == 1)
{
/* Pour eviter d'avoir les carres dans le fichier texte, on met un caractere de fin de chaine. */
enreg[size - 1] = '\0';
fwrite (&enreg, 1, size, sortie);
/* On vide l'eventuel reste du tampon. */
while (getchar () != '\n');
}
}
/******************************************************************************/
/*************************** PROGRAMME PRINCIPAL ******************************/
/******************************************************************************/
int main (void)
{
char nomfich[21] = "";
int menu = 0;
printf (" 0- Creation d'un Nouveau Fichier ?\n"
" 1- Modification d'un Fichier existant ?\n");
scanf ("%d", &menu);
switch (menu)
{
case 0:
{
printf ("Nom du fichier a creer ?");
scanf ("%s", nomfich);
FILE *sortie = fopen (nomfich, "w");
if (sortie != NULL)
{
int count = 0;
do
{
char enreg[16] = "";
printf ("Nom ?");
count = scanf ("%15s", enreg);
fecriture (sortie, enreg, sizeof enreg, count);
printf ("Prenom ?");
count = scanf ("%15s", enreg);
fecriture (sortie, enreg, sizeof enreg, count);
printf ("Numero de telephone ?");
count = scanf ("%15s", enreg);
fecriture (sortie, enreg, sizeof enreg, count);
}
while (count <= 0 || count > 1);
fclose (sortie);
}
}
break;
default:
break;
}
return EXIT_SUCCESS;
} |
En fait, en regardant de plus près, je ne vois pas très bien pourquoi tu utilises fwrite pour enregistrer les données. A moins de vouloir un format fixe, ce qui n'est ni très pratique ni très optimisé, il est préférabe d'utiliser un format texte simple, comme CSV (Les champs sont séparés par des virgules ou des point-virgules). Chaque enregistrement étant terminé par une fin de ligne. On obtient un fichier texte facilement lisible, voire modifiable :
1 2
| Alfred;Wallace;01234567
Jules;Caesar;99999999 |
etc.
Il suffit donc d'utiliser fprintf() directement, avec, par exemple, "%s;%s;%s\n"
D'autre part, la fonction est curieusement conçue. en principe, une fonction fait un travail. Ici, elle en fait 2 complètement disjoints : ecrire dans le fichier, puger stdin. Ca n'a aucun sens... Il n'y a aucun lien entre les deux et ça compromet la réutilisation de la fonction dans un autre contexte...
Il est interessant de faire une fonction qui résout le problème de la saisie d'une façon calire et fiable.
L'enregistrement dans le fichier est complètement autre chose. Le seul lien etre les deux est la donnée saisie, ce qui se modèlise en pseudo-code comme ceci :
1 2 3
|
data := saisir()
enregister(data) |
ou
1 2 3
|
saisir(data)
enregister(data) |
On voit bien les deux fonctions et le lien par les données.
Je te propose de réécrire ton code sur ces bases. Je rappelle qu'une bonne conception est la base de la réussite d'un projet.
Partager