// COURS_25/01/2003 : gestion de fichiers

//
 
/*
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");
}