// cours_01/02/2003 : gestion de fichiers / manipulation de chaines


/*

  I - fichiers , Système de Gestion de Fichiers
		jusqu'en 1970

  II- bases de données (Système de Gestion de Bases de Données)

  III-bases de données multimédias (orienté objet)

  IV-bases de connaissances (faits & règles(prémisses->conclusions->faits temporaires))

  => mémorisation de données



	RAPPEL COURS PRECEDENT :
	création et traitement des fichier EN C:

	FILE  *pf;  / recup adresse du fichier

	char fich_nom[20];  / nom du fichier

	Syntaxe de l'ouverture :
		pf=fopen("nom_du_fichier","mode_acces");  / mode r(ead) w(rite) a(ppend)
		( si NULL : le fichier n'existe pas)

	Lecture de fichier :
		fscanf(nom_pointeur_fichier , format_de_sortie_ , données);
		fscanf(pf,"%d",&i);


  LECTURE D'UN CERTAIN NOMBRE DE CARACTERES

  fgets(buffer,taille,pointeur de fichier);


  FONCTIONS DE MANIPULATION DE CHAINES


  dans <string.h>
  ===============
  strlen(chaine) = donne la longueur d'une chaine
	ex:strcpoy(ville,"boulogne")

  strcpy(chaine1,chaine2) = copie la chaine2 dans la chaine1

  strcap(chaine1,chaine2) = ajoute chaine2 à la fin de la chaine1

  strcmp(chaine1, chaine2) = comparaison de chaines , retourne un entier
	rep :
		negatif : chaine1<chaine2
		nul : chaine1 = chaine2
		positif : chaine1 > chaine2
		

  dans <ctype.h> :
  ==============
  isupper(char) : retourne un entier différent de 0 si caractère majuscule

  islower(char) : retourne un entier différent de 0 si caractère minuscule

  isdigit(char) : retourne un entier différent de 0 si caractère numétrique (chiffre)

  isalpha(char) : retourne un entier différent de 0 si caractère lettre

  isalnum(char) : retourne un entier différent de 0 si caractère alpha-numétrique (chiffre ou lettre)

  isxdigit(char) : retourne un entier différent de 0 si caractère hexadecimal (0-9 A-E)

  isspace(char) : retourne un entier différent de 0 si caractère espace

  tolower(char) : de majuscule à minuscule

  toupper(char) :  de minuscule à majuscule


  dans <stdlib.h> :
  ================
  (relatif à des chaines composées de chiffres)
  atoi(chaine) : retourne la valeur numérique corespondante (alphanumerique to integer)
  
  atol(chaine) : retourne la valeur numérique corespondante (alphanumerique to long)

  atof(chaine) : retourne la valeur numérique corespondante (alphanumerique to float)


   */

#include <stdafx.h>
#include <stdio.h>
#include <string.h>  // fonctions de manipulations de chaines de caractères
#include <ctype.h>  // fonctions de manipulations de chaines de caractères
#include <stdlib.h>  // fonctions de manipulations de chaines de caractères


 // ***************
 //  ** exercice 1  *
 // ***************
void exercice1 ()
{
	int fgetc (FILE  *demo);
	int fputc (int c,FILE  *demo);
	FILE  *demo;  
/* variable flot  */
    int i;

    printf("ouverture du fichier  .txt\n");

	 
/* Ouverture du fichier en lecture */
   if ((demo = fopen("fichier.TXT","w+")) == NULL)
	printf("ERREUR d'ouverture du fichier  .txt\n");


	for (i=65;i<62+29;i++){
		fputc ((unsigned char)i,demo);
        printf("%c",(unsigned char)i);
	}
		if (fclose (demo) ==EOF)

			printf("ERREUR de fermeture du fichier  .txt \n");
}

 // ***************
 //  ** exercice 2  *
 // ***************
void exercice2()
{
	FILE  *pfin;
	char fichnom[20]; 
	char tampon[20];
	printf("\nDonnez le nom du fichier :");
	scanf("%s",fichnom);  // le nom d'un tableau contient son adresse : donc pas de &

	pfin=fopen(fichnom,"r");
	if (pfin==NULL)
	{
		printf("\nfichier %s non trouve",fichnom);
	}
	else
	while (!feof(pfin))
	{
		fscanf(pfin,"%s",tampon);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		printf("\nmot courant :%s",tampon);

	};
};

 //       ***************
 //  ** exercice 3 multiplication  *
 //        ***************
void exercice3()
{
	FILE  *pfin;
	char fichnom[20]; 
	int i=0,j=1;

	printf("\nDonnez le nom du fichier :");
	scanf("%s",fichnom);  // le nom d'un tableau contient son adresse : donc pas de &

	pfin=fopen(fichnom,"w");

   	printf("\nDonnez la valeur de i :");
    scanf("%i",&i);
	 //for (i++)

	{for (j=1;j<=20;j++)
		fprintf(pfin,"\n%i X %i = %i",i,j,(i *j));
	fprintf(pfin,"\n============");
	};
};

 // ***************
 //  ** exercice 4  ** "matching"
 // ***************

void exercice4()
{
	FILE  *pfin1, *pfin2, *pfout;
	char fichin1[20],fichin2[20],fichout[20]; 
	char tampon1[20],tampon2[20];

 //  ** Ouverture du premier fichier *

	printf("\nDonnez le nom du fichier entree 1:");
	scanf("%s",fichin1);  // le nom d'un tableau contient son adresse : donc pas de &
	pfin1=fopen(fichin1,"r");
	if (pfin1==NULL)	{ printf("\nfichier %s non trouve",fichin1);}

 //  ** Ouverture du second fichier *

	printf("\nDonnez le nom du fichier entree 2:");
	scanf("%s",fichin2);  // le nom d'un tableau contient son adresse : donc pas de &
	pfin2=fopen(fichin2,"r");
	if (pfin2==NULL)	{ printf("\nfichier %s non trouve",fichin2);}

 //  ** Ouverture du fichier de sortie en ecriture  *

	printf("\nDonnez le nom du fichier sortie:");
	scanf("%s",fichout);  // le nom d'un tableau contient son adresse : donc pas de &
	pfout=fopen(fichout,"w");
	if (pfout==NULL)	{ printf("\nfichier %s non trouve",fichout);}

 //  ** lecture des  fichiers *

	fscanf(pfin1,"%s",tampon1);
	fscanf(pfin2,"%s",tampon2);

	while ( ( !feof(pfin1) ) || ( !feof(pfin2) ) )  // tant qu'on n'est pas eof1 et eof2 on traite
	{
		if (((strcmp(tampon1,tampon2)<0)&&(!feof(pfin1)))||(feof(pfin2)))  // (1<2 et pas fin de fichier 1) ou (fin de fichier2)
		{
		printf("\n1<2");
		printf("\nmot courant :%s",tampon1);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		fscanf(pfin1,"%s",tampon1);
		}
		else
		if (((strcmp(tampon1,tampon2)>0)&&(!feof(pfin2)))||(feof(pfin1)))  // (1>2 et pas fin de fichier 2) ou (fin de fichier1)
		{
		printf("\n1>2");
		printf("\nmot courant :%s",tampon2);
		fscanf(pfin2,"%s",tampon2);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		}
		else
		{  // 1=2 
		printf("\n1=2");
		printf("\nmot courant :%s",tampon1);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		fscanf(pfin1,"%s",tampon1);
		printf("\nmot courant :%s",tampon2);
		fscanf(pfin2,"%s",tampon2);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		};
	};  // fin while

	fclose(pfin1);
	fclose(pfin2);
	fclose(pfout);


};


 // ***************
 //  ** exercice 5  *
 // ***************

FILE  *ouvrirfichier(char mode[1])
{
	FILE  *pf;
	char fich[20]; 

	printf("\nDonnez le nom du fichier :");
	scanf("%s",fich);  // le nom d'un tableau contient son adresse : donc pas de &
	pf=fopen(fich,mode);
	if (pf==NULL)	{ printf("\nfichier %s non trouve",fich);}

	return pf;

};

void exercice5()
{
	FILE  *pfin1, *pfin2, *pfout;
	char fichin1[20],fichin2[20],fichout[20]; 
	char tampon1[20],tampon2[20];

 //  ** Ouverture du premier fichier *

 
/*	printf("\nDonnez le nom du fichier entree 1:");
	scanf("%s",fichin1);  / le nom d'un tableau contient son adresse : donc pas de &
	pfin1=fopen(fichin1,"r");
	if (pfin1==NULL)	{ printf("\nfichier %s non trouve",fichin1);}
 */
	pfin1=ouvrirfichier("r");

 //  ** Ouverture du second fichier *

 
/*	printf("\nDonnez le nom du fichier entree 2:");
	scanf("%s",fichin2);  / le nom d'un tableau contient son adresse : donc pas de &
	pfin2=fopen(fichin2,"r");
	if (pfin2==NULL)	{ printf("\nfichier %s non trouve",fichin2);}
 */
	pfin2=ouvrirfichier("r");

 //  ** Ouverture du fichier de sortie en ecriture  *

 
/*	printf("\nDonnez le nom du fichier sortie:");
	scanf("%s",fichout);  / le nom d'un tableau contient son adresse : donc pas de &
	pfout=fopen(fichout,"w");
	if (pfout==NULL)	{ printf("\nfichier %s non trouve",fichout);}
	 */
	pfout=ouvrirfichier("w");


 //  ** lecture des  fichiers *

	fscanf(pfin1,"%s",tampon1);
	fscanf(pfin2,"%s",tampon2);

	while ( ( !feof(pfin1) ) || ( !feof(pfin2) ) )  // tant qu'on n'est pas eof1 et eof2 on traite
	{
		if (!feof(pfin1))  // pas fin de fichier 1
		{
		fprintf(pfout,"\nmot courant :%s",tampon1); 
		fscanf(pfin1,"%s",tampon1);
		};
		if (!feof(pfin2))   // pas fin de fichier 2
		{
		fprintf(pfout,"\nmot courant :%s",tampon2);
		fscanf(pfin2,"%s",tampon2);  // lit chaine par chaine : l'espace,la tabulation sont considérés comme séparateur
		};
	};  // fin while

	fclose(pfin1);
	fclose(pfin2);
	fclose(pfout);


};



 // *************************
 //  ** PROGRAMME D EXECUTION  *
 // *************************

void main()

{
	int choix=0;

	printf("\nDebut programme");
	printf("\nQuel exercice ?");
	scanf("%i",&choix);

	switch(choix)
	{
	case 1 : exercice1();break;
	case 2 : exercice2();break;
	case 3 : exercice3();break;
    case 4 : exercice4();break;
    case 5 : exercice5();break;
	default:printf(" *** option non programmée  ***");
	};

	printf("\nFin programme\n");
}