| |
Programmation C |
|
Opérations de
Lecture/Ecriture dans un fichier :
Dans les accès à haut niveau sur les fichiers, distinguons encore la
communication en mode chaîne (traitement individuel des octets) et la
communication de données formatées (traitement des données par bloc).
Pour illustrer ceci, nous allons réaliser un carnet de contacts en C.
L'application finale doit être capable d'ajouter un nombre illimité de contacts
à tout moment sans effacer les enregistrements déjà présents. Il faut bien sur
pouvoir visualiser tous ses contacts sous forme d'une liste avec pagination :
c'es à dire qu'il ne faut afficher un maximum de 5 contacts par page.
Chaque contact doit être renseigné sur les informations suivantes :
- Nom
- Prénom
- Adresse
- Téléphone
- Fax
Nous allons tenter de réaliser ce programme en deux versions : l'une utilisant le mode chaîne,
et l'autre utilisant le mode formaté des données. Commençons par cette dernière
version : le mode formaté, celui-ci étant plus facile, mais limité, vous allez
le voir..
Traitement Formaté des données :
Nous allons stocker nos informations dans une variable de tableau, dont les
éléments sont de type structure. Cette application se compose de deux programmes
: l'un permettant d'ajouter des contacts(programme6.exe), et l'autre permettant
de visualiser la liste des contacts(programme7.exe).
L'écriture des données est possible par l'instruction suivante :
fwrite(<VAR>, <taille>, <nombre>, <pointeur fichier>);
-
<VAR> : Données à
écrire. Dans le cas présent, il s'agit d'un tableau dont les éléments sont
structurés selon la structure
CONTACT
-
<taille> : Taille
d'un élément en octets. Dans le cas présent, il s'agit de la taille d'un
élément du tableau. La fonction
sizeof();
permet de nous calculer l'occupation mémoire à notre place.
-
<nombre> : Nombre
d'éléments à écrire dans le fichier. Dans le cas présent, on veut écrire la
totalité des éléments du tableau dans le fichier. Mais vous pouvez aussi bien
n'écrire qu'un nombre limité d'éléments. par exemple, le premier uniquement,
mettez la valeur numérique 1
-
<pointeur fichier> :
Il s'agit du fichier dans lequel la fonction
fwrite();
doit écrire ses données, désigné par le pointeur fichier. voir le chapitre
précédent pour plus de précisions à propos du pointeur fichier.
Il s'agit de la seule nouveauté
dans ce programme, toutes les autres instructions C sont décrites dans les
chapitres précédents.
Voici le programme6.exe :
#include <stdio.h>
#include <system.h> // pour getche();
main()
{
//+------------------------------+
//| Déclaration de la structure |
//| CONTACT |
//+------------------------------+
struct CONTACT
{
char nom[20];
char prenom[20];
char adresse[20];
char telephone[15];
char fax[15];
} TabContacts[50];
//+------------------------------+
//| Déclarations de variables |
//+------------------------------+
FILE *fp;
int c,i;
c = 49;
i = 0;
while(c==49 && i<10)
{
//+------------------------------+
//| Affichage du formulaire |
//+------------------------------+
printf("\n+-------------------------------------------------------------------+");
printf("\n| Editer votre liste de contacts (ecrase les anciennes donnees) |");
printf("\n+-------------------------------------------------------------------+");
printf("\n\nNom : \t\t");
scanf("%s",TabContacts[i].nom);
printf("\nPrenom : \t");
scanf("%s",TabContacts[i].prenom);
printf("\nAdresse : \t");
scanf("%s",TabContacts[i].adresse);
printf("\nTELEPHONE : \t");
scanf("%s",TabContacts[i].telephone);
printf("\nFAX : \t\t");
scanf("%s",TabContacts[i].fax);
printf("\n\nAppuyez sur 1 pour ajouter un nouveau contact");
printf("\nAppuyez sur n'importe quelle autre touche pour quitter");
printf("\nVotre choix : \t");
i++;
c = getche();
}
//+------------------------------+
//| Ecriture des données |
//+------------------------------+
fp = fopen("data.dat","w+");
fwrite(TabContacts, sizeof(struct CONTACT), i, fp);
fclose(fp);
printf("\n\n\tContacts enregistres avec succes !\n\n");
printf("\n > Appuyez sur une touche pour fermer l'application");
getche();
}
|
Voici un exemple de déroulement de
ce programme :

Nous avons
procédé à une inscription, puis entré la valeur 1 pour inscrire une seconde
personne. Nous pouvons inscrire de cette façon jusqu'a 50 personnes au maximum.
La raison de cette limitation est simple : la variable de tableau dont les
éléments de type structurés occupent 90 octets chacun, soit un total de
90*50=4500 octets. Les ressources n'étant pas infinies, nous ne pouvons pas
inscrire de contacts infiniment.
En effet, nous stockons temporairement l'ensemble des données dans un tableau
puis, écrivons l'ensemble des données lorsque l'utilisateur ne souhaite plus
inscrire de nouveaux contacts. De cette manière, notre première contrainte nous
imposant un nombre illimité de contacts n'est pas respectée !
De plus, les précédents contacts, déjà présents seront écrasés lors de la
nouvelle opération d'écriture. C'est à dire que dans le cas présent, nous venons
d'effacer les anciens enregistrements et d'écrire ces deux contacts (Tintin et
Toto). En effet, le mode d'ouverture utilisé est W+, du fait qu'il est impossible
de lire correctement les données ajoutées ultérieurement en mode ajout A. En
tout cas, cela échoue sous le compilateur Miracle C. La seconde contrainte n'est
pas respectée !
|