caennais14000
1Messages postés
29 novembre 2010Date d'inscription
29 novembre 2010Dernière intervention
29 nov. 2010 à 12:40
#include "entete.h"
FILE* ouvrir_fichier(char *nomfichier)//On passe le nom du fichier "nomfichier" à la fonction "ouvrir_fichier()" qui retourne un identifiant de fichier.
{
FILE* fichier = NULL;
char* extension = ".txt";//On déclare une chaine de caractères "extension" qui contient l'entension d'un fichier texte.
int taille = strlen(nomfichier);//On déclare une variable entière "taille" qui contient la taille du nom entré.
if( (*((nomfichier)+taille-4)!=46) && (*((nomfichier)+taille-3)!=116) && (*((nomfichier)+taille-2)!=120) && (*((nomfichier)+taille-1)!=116))
strcat_s(nomfichier,strlen(nomfichier)+strlen(extension)+1,extension);
//On teste si l'extension a déjà été mise avec le nom, sinon on ajout le ".txt" au nom entré par l'utilisateur.
fopen_s(&fichier,nomfichier,"r");//On ouvre le fichier "nomfichier" d'identifiant "fichier" et l'option "r" avec la fonction "fopen_s()"
if(fichier!=NULL)//On teste si le fichier exite réellement. Si oui on ferme le fichier existant.
{
printf("le fichier existe\n\n");
fclose(fichier);
}
else
{
printf("le fichier n'existe pas, il va le creer\n\n");
}
fopen_s(&fichier,nomfichier,"a");//On crée le fichier "nomfichier" d'identifiant "fichier" et l'option "r" avec la fonction "fopen_s()"
return fichier;//On retourne l'identifiant du fichier.
}
enregistrement saisie_enr()//On déclare un fonction "saisie_enr()" qui retourne une struture de données "enregistrement".
{
enregistrement dossier;//On déclare une structure "dossier".
do
{
printf("\nVeuiller entrer un nom : ");
fflush(stdin);
}while(scanf_s("%29[a-zA-Z]",dossier.nom,30)==0);
//On demande un nom tant que ce que l'utilisateur entre autre chose que des caractères (a->z et A->Z).
//Et on met la chaine dans "dossier.nom" qui appartient à la structure dossier.
do
{
printf("\nVeuiller entrer un prenom : ");
fflush(stdin);
}while(scanf_s("%19[a-zA-Z]",dossier.prenom,20)==0);
//On demande un prénom tant que ce que l'utilisateur entre autre chose que des caractères (a->z et A->Z).
//Et on met la chaine dans "dossier.prenom" qui appartient à la structure dossier.
do
{
printf("\nVeuiller entrer un numero de telephone : ");
fflush(stdin);
}while((scanf_s("%10[0-9]",dossier.num_tel,11)==0) || (strlen(dossier.num_tel)!=10));
//On demande un nom tant que ce que l'utilisateur entre autre chose que des nombre (0->9).
//Et on met la chaine dans "dossier.num_tel" qui appartient à la structure dossier.
do
{
printf("\nVeuiller entrer une adresse e-mail : ");
fflush(stdin);
}while(scanf_s("%29[a-z0-9@.]",dossier.mail,30)==0);
//On demande un nom tant que ce que l'utilisateur entre autre chose que les caractères: a->z, 0->9 et @.
//Et on met la chaine dans "dossier.mail" qui appartient à la structure dossier.
return dossier;//On retourne la structure "dossier".
}
void ajout_enr(FILE* fp)//On passe un pointeur sur un fichier "file" à la fonction "ajout_enr()"
{
enregistrement dossier;//On crée un enregistrement "dossier" qui va contenir les informations.
dossier=saisie_enr();//On appelle la fonction "saisie_enr()" qui nous retourne toutes les informations entrées dans la structure "dossier".
fprintf(fp,"%s\n%s\n%s\n%s\n\n",dossier.nom,dossier.prenom,dossier.num_tel,dossier.mail);//On copie toute la structure avec un fprintf() auquel on passe l'identifiant du fichier et les données de la structure.
}
void affiche_repertoire(char *nomfichier)//On passe le nom du fichier "nomfichier" à la fonction "affiche_repertoire()"
{
FILE *fichier;//On crée un pointeur sur un fichier "fichier"
fopen_s(&fichier,nomfichier,"r");//On ouvre le fichier "nomfichier" d'identifiant "fichier" et l'option "r" avec la fonction "fopen_s()"
int nbr=0;//On déclare une variable entière "nbr" pour calculer le nombre de ligne.
char buf[256];//On déclare un tableau de 256 caractères "buf".
while(fgets(buf,255,fichier) != NULL)//On lit le fichier tant que le fichier est différent de NULL.
{
nbr++;
}
rewind(fichier);//On rembobine le fichier d'identifiatn "fichier" au début avec la fonction "rewind"
char* contenu = (char*)malloc(nbr*255*sizeof(char*));//On déclare un tableau de "nbr" chaines de 255 caractères nommé "contenu".
char c =(char)getc(fichier);//On prends le premier caractère du fichier ayant pour identifiant "fichier" que l'on met dans "c"
contenu[0]=c;//On met le caractère obtenu dans la première case mémoire du tableau "contenu[]".
int i=0;//On déclare une variable "i" à 0 pour avancer dans le tableau.
while(c!=EOF)//Tant que l'on a pas la fin de fichier, on avance dans le fichier pour mettre tous les caractères dans le tableau.
{
i++;
c=(char)getc(fichier);
contenu[i]=c;
}
fclose(fichier);//On ferme le fichier.
contenu[i]='\0';//On met le caractère le fin de chaine à la fin du tableau.
printf("%s",contenu);//On affiche le contenu du fichier qui est dans "contenu".
}
void Tri_repertoire(char *nom_fichier)
{
FILE *fichier;//On crée un pointeur sur un fichier "fichier"
fopen_s(&fichier,nomfichier,"r");//On ouvre le fichier "nomfichier" d'identifiant "fichier" et l'option "r" avec la fonction "fopen_s()"
int i=0,j=0,x=0,nbr_ligne=0,nbr_personne=0;//On déclare 5 variables entières dont 3 pour les boucles et 2 pour calculer les nombre de lignes et de personnes.
char buffer[256];//On déclare un tableau de 256 caractères "buffer".
while(fgets(buffer,255,fichier))//On lit le fichier tant que le fichier est différent de NULL.
{
nbr_ligne++;
}
nbr_personne = nbr_ligne/5;//On calcule le nombre de personne à partir du nombre de lignes.
fseek(fichier,0,SEEK_SET);//On retourne au début du fichier ayant pour identifiant "fichier".
enregistrement *id = (enregistrement*)malloc(nbr_personne*sizeof(enregistrement));//On crée un tableau d'enregistrements pour "nbr_personne" personnes nommé "id"
char* espace[100];//On crée un tableau de 100 chaines de caractères "espace"
for(i=0;i<nbr_personne;i++)//On crée une boucle pour "nbr_personne" personnes. On met chaque personnes dans chaque case mémoire de "id".
{
fgets(id[i].nom,strlen(id[i].nom),fichier);
printf("%s\n",id[i].nom);
fgets(id[i].prenom,strlen(id[i].prenom),fichier);
printf("%s\n",id[i].prenom);
fgets(id[i].num_tel,strlen(id[i].num_tel),fichier);
printf("%s\n",id[i].num_tel);
fgets(id[i].mail,strlen(id[i].mail),fichier);
printf("%s\n",id[i].mail);
fgets(espace[i],255,fichier);
}
fclose(fichier);//On ferme le fichier ayant pour identifiant "fichier".
for(j=0;j<nbr_personne;j++)// On trie chaque personne par la première lettre de chaque nom. On change chaque enregistrement en cas d'inversion
{
for(i=nbr_personne-1;i>j;i--)
{
if(id[i].nom[0]<id[i-1].nom[0])
{
enregistrement tmp;
tmp=id[i];
id[i]=id[i-1];
id[i-1]=tmp;
}
}
}
fopen_s(&fichier,nom_fichier,"w");//On ouvre le fichier "nomfichier" d'identifiant "fichier" et l'option d'écrasement "w" avec la fonction "fopen_s()"
for(i=0;i<nbr_personne;i++)//On crée une boucle pour "nbr_personne" personnes. On enregistre chaque personnes de chaque case mémoire de "id" dans le fichier.
{
fprintf(fichier,"%s",id[i].nom);
fprintf(fichier,"%s",id[i].prenom);
fprintf(fichier,"%s",id[i].num_tel);
fprintf(fichier,"%s",id[i].mail);
fprintf(fichier,"\n");
}
fclose(fichier);//On ferme le fichier ayant pour identifiant "fichier".
}
Sabug
Ensuite on essaye d'écrire dans ce fichier, pointé par f. S'il a été ouvert avec succès (f != NULL), alors on écrit dans f les valeurs de X et Y qui sont en fait "i" et "i+1". Puis on ferme le fichier.
Sinon on n'est pas parvenu à écrire le fichier. Dans ce cas on affiche un message d'erreur. Comme le fichier n'a pas été ouvert, on n'a pas à le fermer.
On répète le procédé pour chaque valeur de i, puis on quitte le programme proprement.