Professional Documents
Culture Documents
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
Exercices algorithme
Mise en oeuvre des chanes des structures et des
fichiers
Contraintes gnrales:
On cr et on utilise une structure Annuaire qui contient les champs d'un
enregistrement.
On veille faire une fonction lorsque l'on retourne un seul paramtre
Le chemin et le nom du fichier et dfini dans le programme principal.
Aucune variable globale n'est admise sauf la structure Annuaire.
Le programme principal contient un minimum de code, il gre les appels de
fonctions.
Les enregistrements sont fait la suite du denier enregistrement du fichier.
L''ouverture de flux de fichiers est donc fait en mode ajout (append).
On respecte la structure de l'application prsente dans l'algorithme de
premier niveau.
1
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
xx
On ne peut pas consulter un enregistrement
Pour la saisie des champs, on passe en paramtre les lments de la
structure
L'age peut tre transform en chane de caractres
Pour l'accs squentiel, on peut utiliser les fonctions fprintf, fscanf, fputs,
fgets
Application :
Ecrire l'algorithme.
Ecrire le code C correspondant l'algorithme ci-dessus.
Application :
Ecrire l'algorithme.
Ecrire le code C correspondant l'algorithme ci-dessus.
2
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
Application :
Ecrire l'algorithme.
Ecrire le code C correspondant l'algorithme ci-dessus.
3
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
Maquette de l'application
Menu choix
4
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
5
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
6
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
Lecture du fichier
Annuaire : struture
Annuaire.Nom : chaine 20 caractres
Annuaire.Age : Entier
Annuaire.NumeroTel : chaine 14 caractres
Effacer l'cran
Partie 1
//On passe en rfrence les champs de la structure Annuaire
saisirUnAgendaSeq(UnAnnuaire.Nom, UnAnnuaire.Age,
UnAnnuaire.NumeroTel)
//On passe en rfrence la structure Annuaire
EnregistrerAgendaDansFichierSeq(CheminFichierSeq,UnAnnuaire)
Partie 2
saisirUnAgendaDirect(UnAnnuaire)
EnregistrerAgendaDansFichierDirect(UnAnnuaire)
Partie 3
saisirUnAgendaDirect(UnAnnuaire)
EnregistrerAgendaDansFichierDirectStructure(UnAnnuaire)
7
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
Rponse
//---------------------------------------------------------------------------
// Travaux pratiques :
// Mise en oeuvre des structures de donnes
// criture et lecture d'un fichier
//
// En accs squentiel
// En accs direct
//P. TREBOSC Novembre 2007
//Version 1
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <sys\stat.h>
#include <dos.h>
//Variables globales
struct agenda{
char Nom[20]; //Le nom max 19 caractres
int Age;
char NumeroTel[14];
};
8
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
9
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
*MonAgenda)
{
//Dclaration du fichier
FILE *fichier;
char UnEnregistrement[52]="";
char tempAge[4];
//Enregistrement
//Ouverture du fichier texte en criture ajout
if((fichier = fopen(CheminFichier,"at"))== NULL)
printf("erreur l'ouverture du fichier %s en criture\n",CheminFichier);
//Ecriture de l'enregistrement
//Ecriture d'une chaine formate pas de pb pour crire une chaine
//contenant des espaces
//Test ok avec fscanf sauf la ligne si un blanc dans la chaine
fprintf(fichier,"%s",UnEnregistrement);
//fwrite(&UnEnregistrement, sizeof(UnEnregistrement),1,fichier);
//Fermeture du fichier
fclose(fichier);
}
10
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
char MonAge[4];
//Initialisation des variables locales
//Indispensable pour ne pas avoir de caractres parasites
strcpy(MonAge," ");
strcpy(UnAgenda.Nom," ");
UnAgenda.Age=0;
strcpy(UnAgenda.NumeroTel," ");
//Recherche de l'age
while(MonEnregistrement[j+i+1] != ';'){
MonAge[j] = MonEnregistrement[j+i+1];
j++;
}
printf("%-4s",MonAge);
UnAgenda.Age = atoi(MonAge);
11
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
clrscr();
if((fichier = fopen(CheminFichier,"r"))==NULL){
printf("Erreur l'ouverture du fichier %s ",CheminFichier);
exit(1);
}
//Ecriture entte
EnteteFeuille("Lecture d'un fichier sequentiel\nAvec traitement de
structure\n ");
//Ne peut tre utilis que lorsque l'on connait la taile prcise
//de l'enregistrement. Ici on lit 52 octets, si, il y a des retours
// la ligne on passe la ligne grace au printf
//Ne pas utiliser dans notre cas :
//fread(UnEnregistrement,39,1, fichier);
//On traite chaque ligne pour la mettre en structure si ncessaire
//Affichage l'cran sans mise en forme
//printf("%s",UnEnregistrement);
//Le dernier champ enregistr est NULL du fait du retour chariot
// l'enregistrement
12
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
fclose(fichier);
}
//Enregistrement
//Ouverture du fichier texte en criture ajout
if((fichier = fopen(CheminFichier,"at"))== NULL)
printf("erreur l'ouverture du fichier %s en criture\n",CheminFichier);
//Ecriture de l'enregistrement
//Nombre minimum de caractres dfinis avec justification gauche
//Si le \n est mis, cela positionne un retour chariot donc un enregistrement
//vide est enregistr
//Par contre on a automatiquement un retour chariot lors de la lecture du
//fichier texte l'cran (c'est un choix)
fprintf(fichier,"%-19s %-3s %-14s",MonNom,MonAge,NumeroTelephone);
//Fermeture du fichier
fclose(fichier);
}
//Lecture d'un fichier en accs direct
void LectureFichierPosition(char *CheminFichier)
{
//Dclaration du fichier
FILE *fichier;
13
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
//Dfinition de l'indice
int positionIndice = 0;
char MonNom[20]="", MonAge[4]="",NumeroTelephone[14]="";
//Choix de l'indice
printf("Choisir le numro d'enregistrement de lecture du fichier : ");
scanf("%d", &positionIndice);
//Attention : On commence 0 donc dcaler de 1 pour avoir la bonne
//correspondance numro d"'enregistrement indice de lecture du fichier
//Il faut tenir compte du caractre retour chariot ajout \n
//Pour une chane de 38 +1
//puis encore +1 pour le caractre suivant
positionIndice = (positionIndice-1) * 38;
14
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
{ //Dclaration du fichier
FILE *fichier;
int NbEnr;
//Ouverture du fichier en ecriture append
if((fichier = fopen(CheminFichier,"at"))==NULL){
printf("Erreur l'ouverture du fichier %s ",CheminFichier);
exit(1);
}
//NbEnr = fwrite(MonAgenda,sizeof(*MonAgenda),1,fichier);
//ou
NbEnr = fwrite(MonAgenda,sizeof(struct agenda),1,fichier);
//fputs(MonAgenda,fichier);
fclose(fichier);
}
if((fichier = fopen(CheminFichier,"r"))==NULL){
printf("Erreur l'ouverture du fichier %s ",CheminFichier);
exit(1);
}
//Ecriture entte
EnteteFeuille("Lecture par sturucture dans un fichier a acces direct\n");
printf("Nom Age Numero telephone\n");
//Lecture du fichier - On lit ligne par ligne
positionIndice=0;
while(!feof(fichier)){
strcpy(MonAgenda.Nom ," ");
//
for(i=0;i<strlen(MonAgenda.Nom);i++)
MonAgenda.Nom[i]=NULL;
for(i=0;i<strlen(MonAgenda.NumeroTel);i++)
MonAgenda.NumeroTel[i]=NULL;
15
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
fseek(fichier,positionIndice,0);
fread(&MonAgenda,sizeof(struct agenda),1,fichier);
//Fermeture du fichier
fclose(fichier);
}
char choixAcces(void)
{ char choix;
printf("Partie 1 - fichier sequentiel:\n");
printf(" Saisir et enregistrer -> 1\n");
printf(" Lire -> 2\n\n");
printf("Partie 2 - fichier accs direct :\n");
printf(" Saisir et enregistrer -> 3\n");
printf(" Lire -> 4\n\n");
printf("Partie 3 - fichier accs direct d'une structure :\n");
printf(" Saisir et enregistrer -> 5\n");
printf(" Lire -> 6\n\n");
printf("Votre choix : ");
fflush(stdin);
scanf("%c",&choix);
return choix;
}
#pragma argsused
void main(int argc, char* argv[])
{
struct agenda UnAgenda;
char *CheminFichierSeq;
char *CheminFichierDir;
char *CheminFichierDirStruc;
char choixAccesfichier;
char Continuer=NULL;
16
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
CheminFichierSeq =
"D:\\Prgm_Builder\\PrgmConsoleAlgo\\FichierPersonne\\agendaSeq.txt";
CheminFichierDir =
"D:\\Prgm_Builder\\PrgmConsoleAlgo\\FichierPersonne\\agendaDir.txt";
CheminFichierDirStruc =
"D:\\Prgm_Builder\\PrgmConsoleAlgo\\FichierPersonne\\agendaDirStruc.txt";
do{
clrscr();
choixAccesfichier = choixAcces();
switch (choixAccesfichier){
//Partie 1
//Pour enregistrement et lecture fichier squentiel
//--------------------------------------------------------------------------
case '1' :
//Passage de la structure par lment
saisirUnAgendaSeq(&UnAgenda.Nom, &UnAgenda.Age,
&UnAgenda.NumeroTel);
EnregistrerAgendaDansFichierSeq(CheminFichierSeq,&UnAgenda);
break;
case '2' :
LectureFichierSeq(CheminFichierSeq);
break;
//Partie 2
//Pour enregistrement et lecture fichier accs direct
//Pour l'accs direct : taille des enregistrements fixe
//--------------------------------------------------------------------------
case '3' :
//Passage de la structure en paramtre
//Comme la fonction doit modifier la structure, le programme passe la
//fonction un pointeur vers la structure
//variable structure par rfrence (ou par adresse)
saisirUnAgendaDirect(&UnAgenda);
EnregistrerAgendaDansFichierDirect(CheminFichierDir,&UnAgenda);
break;
case '4' :
LectureFichierPosition(CheminFichierDir);
break;
//Partie 3
//Pour enregistrement et lecture fichier accs direct
//Pour l'accs direct : taille des enregistrements fixe
//--------------------------------------------------------------------------
case '5' :
//Passage de la structure en paramtre
17
Lyce technique Saint Michel : BTS IRIS
15/03/17
Exercice ralgorithme : 348244614.odt P.
TREBOSC
EnregistrerAgendaDansFichierDirectStructure(CheminFichierDirStruc,&UnA
genda);
break;
case '6' :
LectureFichierPositionStructure(CheminFichierDirStruc);
break;
}
printf("Voulez vous continuer : \n");
printf(" Oui -> 1\n");
printf(" Non -> 0\n");
fflush(stdin);
scanf("%c",&Continuer);
}while(Continuer == '1');
getch();
}
//---------------------------------------------------------------------------
18