//
/*
sauvegarde des elements d'une liste dans un fichier
GESTION DES FICHIERS
======================
un fichier est une suite d'unites syntaxiques structurées accessibles sequentiellement
ou directement.
l'interet du fichier reside dans le fait qu'un fichier sauvegarde des données pour une
unitilisation future.
Un fichier est une ressource stockant des données partageable par plusieurs programmes.
La contrainte principale d'utilisation d'un fichier donné par un programme, une requete,
ou un programmeur, est le droit d'accès.
L'interet des fichiers pour les traitements de données est de pouvoir consulter et mettre
à jour ces données par programmation ou par edition de texte.
création et traitement des fichier EN C:
toute action (ouverture,lecture,ecriture...) sur des fichiers passe par un accès moyennant
l'adresse permettant de localiser ce fichier.
la valeur de l'adresse affectera une variable intermédiaire permettant l'accès au fichier.
Cette variable est de type pointeur.
FILE *pf;
Tout accès à un fichier est pré-conditionné par une opération d'ouverture du fichier concerné.
Cette ouverture exige 2 paramètres :
1)le nom du fichier (chaine de caractères)
2)son mode d'accès (chaine de caractères)
"r" read (lecture)
"w" write (cree si inex;ECRASE LE FICHIER SI LE FICHIER EXISTE => perte des infos déjà enregistrées)
"a" append (ajout en fin de fichier)
Toutes les opérations sur les fichiers commencent par f (fopen, fscanf, fprint,...)
Syntaxe de l'ouverture :
pf=fopen("nom_du_fichier","mode_acces");
( si NULL : le fichier n'existe pas)
Lecture de fichier :
fscanf(nom_pointeur_fichier , format_de_sortie_ , données);
fscanf(pf,"%d",&i);
voir EXO3;
*/
#include "stdio.h"
#include "stdafx.h"
#include <string.h>
// DECLARATIONS GLOBALES
// DECLARATION EXO2
struct cel // cel : nom du type de cellule
{ int info; //données
cel *voisin; //reference recursive, pointeur vers le voisin = NULL si par de voisin
};
struct cel *tliste, *fliste; // tete et fin de liste vers structure de type cel
struct cel *surf, *surf_avant; // pointeur pour parcourir la liste
int i;
int i_mini=0,i_maxi=0;
/* pour ajouter une nouvelle option: ajouter une chaine associée à un pointeur ajouter 1 aux valeurs d'index mettre à jour la table des options developper le code de cette nouvelle option et l'integrer dans la fonction exo2 */
// elements du menu
char *pcA ="Ajouter un element au debut";
char *pcF ="Ajouter un nouvel element en fin de liste";
char *pcR ="Rechercher un element dans la liste";
char *pcS ="Supprimer un element de la liste";
char *pcL ="Afficher les elements de la liste";
char *pcT ="Trier les elements de la liste";
char *pcEnr ="Enregistrer les elements de la liste";
char *pcCharger ="Charger les elements de la liste";
int nb_options =8;
// valeur des choix
char tab_valopt [8]={'a','f','r','s','l','t','e','c'};
char *tab_options [8]={pcA,pcF,pcR,pcS,pcL,pcT,pcEnr,pcCharger};
// declaration des fonctions
void Ajouter_en_tete() {
// NOUVELLE VALEUR
printf("\nSaisir une nouvelle donnée :");
surf=new cel; // creation d'une nouvelle structure cel et stockage de son adresse dans surf
scanf("%i",&surf->info);
getchar();
surf->voisin=NULL;
if (fliste==NULL) {fliste=surf;}; // dans la cas d'une liste vide
surf->voisin=tliste; // surf pointe vers la premier element de la liste
tliste = surf; // le debut de liste pointe vers surf
};
void Ajouter_en_fin() {
// NOUVELLE VALEUR
printf("\nSaisir une nouvelle donnée :");
surf=new cel; // creation d'une nouvelle structure cel et stockage de son adresse dans surf
scanf("%i",&surf->info); // mettre la valeur saisie dans la zone info de la cellule
getchar();
surf->voisin=NULL;
if (tliste==NULL)
{tliste=surf;} // dans la cas d'une liste vide
else
{
fliste->voisin = surf; // le dernier element a pour voisin surf
}; // la fin de liste pointe vers surf
fliste=surf;
};
void Rechercher_un_element() {
int rech=0;
i=1;
printf("\nSaisir une valeur à chercher :");
scanf("%i",&rech);
getchar();
surf=tliste;
while (surf!=NULL)
{
if (surf->info==rech) {printf("\n -> trouvé à l'index %i",i);};
i++;
surf=surf->voisin;
}; // fin while
};
void Afficher_les_elements() {
i_mini=0;
i_maxi=0;
if (tliste==NULL) {printf("\n-- la liste est vide --");}
else
{
surf=tliste;
i=1;
i_mini=i;
while (surf != NULL)
{
printf("\n %ieme element de la file %i",i,surf->info);
surf=surf->voisin;
i_maxi=i;
i++;
}; // fin while
};
};
void Supprimer_un_element() {
int rech = 0;
Afficher_les_elements();
if (i_mini!=0)
{
printf("\nDonnez l'index de l'element à supprimer :");
printf("\nentre %i et %i :",i_mini, i_maxi);
scanf("%i",&rech);
getchar();
if ((rech<i_mini)||(rech>i_maxi))
{printf("\n *** index hors limites ***");}
else
{printf("\nsuppression en cours");
i=1;
surf=tliste;
surf_avant=NULL;
while (i<rech)
{printf("\n %ieme element de %i de la file %i",i,rech,surf->info);
surf_avant=surf;
surf=surf->voisin;
i++;
};
printf("\n A SUPPRIMER :");
printf("\n %ieme element de %i de la file %i",i,rech,surf->info);
// surf est l'element à supprimer
// si 1er element : cad surf=tliste
// tliste = surf->voisin
if (rech==i_mini) { tliste=surf->voisin;}
// si dernier element : cad surf=fliste
// fliste = avant_surf
// avant_surf->voisin==NULL
else
{
if (rech==i_maxi) { fliste=surf_avant; surf_avant->voisin=NULL; }
// autre :
// avant_surf->voisin==surf
else
{ surf_avant->voisin=surf->voisin;};
}; // fin else
// ici : desallocation de la cellule pointée par surf
}; // fin else
}; // fin if (i_mini!=0)
};
// TRIER LES ELEMENTS
/* */
void Trier_les_elements()
{
/* variable max:cle indice_max:entier; pour i variant de n à 2 par pas de -1 repeter max<-cle(i);inhdice_max<-i; pour j variant de 1-1 à 1 par pas de -1 repeter si cle(j)>max alors max<-cle(j); indice_max<-j; permutter tableau(i) /tableau(i_max) / tableau i à n trie */
};
/* exercice 1 */
void exo1 ()
{int i;
char x;
for (i=0;i<6;i++)
{
printf("\nDonner la valeur de x ? :");
x=getchar ();getchar();
switch(x)
{
case 'a':
case 'A': printf("\n Traitement A \n");break;
case 'b':
case 'B': printf("\n Traitement B \n");break;
case 'i':
case 'I': printf("\n Traitement I \n");break;
case 'n':
case 'N': printf("\n Traitement N \n");break;
default:printf("Traitement par defaut: \n");
} // fin switch
} // fin for
};
/* exercice 2 */
// convertir un caractere en majuscule
char majuscule(char valeur)
{
return (valeur-32);
};
void affiche_valopt(int index_tab_valopt)
{
printf("\n %c (%c) - %s",tab_valopt[index_tab_valopt],majuscule(tab_valopt[index_tab_valopt]),tab_options[index_tab_valopt]);
};
char exo2_menu()
{ char choix = 'o';
printf("\n\n================================");
printf("\nOperations sur liste dynamique :");
printf("\n================================");
for (i=0;i<=(nb_options-1);i++)
{
affiche_valopt(i);
};
printf("\n Q (q) - Quitter l'application");
printf("\nEntrez votre choix :");
choix=getchar(); getchar();
return choix;
};
// recherche de la valeur saisie dans le tableau des options et retourne VRAI si trouve
bool affiche_option_choisie(char choix)
{
bool trouve=false; // = je n'ai pas trouve
for (i=0;((i<=(nb_options-1)));i++)
{
//printf("%i i=",i);
if ((choix==tab_valopt[i])||(choix==(majuscule(tab_valopt[i])))) // ? choix option ou majuscule
{
trouve=true; // j'ai trouvé
affiche_valopt(i);
}
};
if (!trouve) // si different de trouve (si je n'ai pas trouvé)
{
printf(" ***** choix invalide : %c",choix);
};
return trouve;
};
void exo2()
{
// INITIALISATION
tliste=NULL;
fliste=NULL;
char choix='o';
choix=exo2_menu();
while ((choix!='q')&&(choix!='Q'))
{
if (affiche_option_choisie(choix))
{
switch (choix)
{
case 'a': case 'A' : Ajouter_en_tete();
break;
case 'f': case 'F' : Ajouter_en_fin();
break;
case 'r': case 'R' : Rechercher_un_element();
break;
case 's': case 'S' : Supprimer_un_element();
break;
case 'l': case 'L' : Afficher_les_elements();
break;
case 't': case 'T' : Trier_les_elements();
break;
default: printf(" ***OPTION NON PROGRAMEE ***");
break;
}; // fin switch
};
choix=exo2_menu();
}; // fin while
};
/* lecture d'un fichier texte */
void exo3()
{
FILE *pf;
char *chaine;
chaine=NULL;
pf=fopen("data.txt","r");
printf("\nfichier ouvert");
if (!pf==NULL)
{
while (!(feof(pf)))
{
fscanf(pf,"%s",&chaine);
printf("\n %s",&chaine);
};
}
else
{printf("pb acces au fichier");};
fclose(pf);
pf=NULL;
};
void main()
{
printf("\nDebut programme");
//exo1();
//exo2();
exo3();
printf("\nFin programme\n");
}