/*!\file functionFile.c * * \author SOUPLET Antoine * \version 1.0 * \date 09-01-2012 * * \brief Fichier contenant les fonctions traitant des fichiers, telles que celles qui extraient les informations des fichiers L-System et FLame * */ #include "functionAdd.h" #include #include "functionFile.h" #include "postfix.h" #include #include #include "check.h" //Lit un fichier de type L-System et extrait les informations qu'il contient dans un tableau deux dimensions de caractère (tableau de chaine de caractère) char** readFileOfLsystem(char* pc_fileName) { FILE* fi_file;//Pointeur vers un fichier correspondant au fichier L-System dont on souhaite extraire les informations int i_currentChar;//entier correspondant au char en cours de lecture char c_ch;//caractère correspondant au char en cours de lecture int i_cpt;//entier permettant de compter les lignes du fichier char** ppc_tab;//tableau de chaines de caractères char* pc_line;//chaine de caractère représentant la ligne en cours de lecture i_currentChar=0;//affecte la valeur 0 à l'entier i_currentChar i_cpt=0;//affecte la valeur 0 à l'entier i_cpt (compteur de ligne) pc_line=myMalloc(200*sizeof(char));//alloue la mémoire nécéssaire à la chaine de caractère pc_line *pc_line='\0';//efface tous les caractères présents dans la chaine de caractère pc_line ppc_tab=myMalloc(100*sizeof(char*));//alloue la mémoire nécéssaire au tableau de chaine de caractère ppc_tab fi_file = fopen(pc_fileName, "r");//ouvre le fichier nommé par pc_fileName, retourne 0 si l'opération est un échec. if(fi_file==0) { exitErrorFileName(pc_fileName,"L-System");//si la lecture du fichier est un échec, alors on quitte le programme en affichant un message d'erreur } else { i_currentChar = fgetc(fi_file);//affecte à l'entier i_current le caractère lu (possible car il n'existe pas de type fort en C while (i_currentChar != EOF) {//tant que nous ne sommes pas à la fin du fichier c_ch=i_currentChar;//affecte au caractère c_ch l'entier lu if(c_ch=='\n') {//si nous sommes à la fin de la ligne alors on ajoute la ligne lue dans le tableau de chaines de caractères après avoir alloué la mémoire de la future position de la chaine de caractère dans le tableau de chaines de caractères ppc_tab[i_cpt]=myMalloc(200*sizeof(char));//alloue la mémoire à la position où l'on ajouter la ligne lue depuis le fichier strcpy(ppc_tab[i_cpt],pc_line);//copie de la ligne lue dans le tableau de chaine de caractère *pc_line='\0';//efface tous les caractères présents dans la chaine de caractère pc_line i_cpt++;//incrémente le compteur de ligne i_cpt } else {//si nous ne sommes pas à la fin de la ligne, on concatène le caractère lue à la chaine de caractère pc_line sprintf(pc_line,"%s%c",pc_line,c_ch);//concatène le caractère lue à la chaine de caractère pc_line } i_currentChar = fgetc(fi_file);//lit le caractère suivant } } testCorrectLsystemFile(ppc_tab,i_cpt,pc_fileName);//teste si les informations extraites du fichier sont correctes free(pc_line);//libère l'espace mémoire alloué à la chaine de caractère pc_line fclose(fi_file);//ferme le flux fichier return (ppc_tab);//retourne le tableau de chaine de caractère } //Lit un fichier de type Flame et extrait les informations qu'ils contient dans un tableau deux dimensions de caractère (tableaux de chaine de caractère) char** readFileOfFlame(char* pc_fileName) { int i_currentChar;//entier correspondant au char en cours de lecture char c_ch;//caractère correspondant au char en cours de lecture int i_cpt;//entier permettant de compter les lignes du fichier char** ppc_tab;//tableau de chaines de caractères char* pc_line;//chaine de caractère représentant la ligne en cours de lecture FILE* fi_file;//Pointeur vers un fichier pc_line=myMalloc(200*sizeof(char));//alloue la mémoire nécéssaire à la chaine de caractère pc_line ppc_tab=myMalloc(100*sizeof(char*));//alloue la mémoire nécéssaire au tableau de chaine de caractère ppc_tab *pc_line='\0';//efface tous les caractères présents dans la chaine de caractère pc_line i_cpt=0;//affecte la valeur 0 à l'entier i_cpt (compteur de ligne) i_currentChar=0;//affecte la valeur 0 à l'entier i_currentChar fi_file = fopen(pc_fileName, "r");//ouvre le fichier nommé par pc_fileName, retourne 0 si l'opération est un échec. if(fi_file==0) { exitErrorFileName(pc_fileName,"Flame");//si la lecture du fichier est un échec, alors on quitte le programme en affichant un message d'erreur } else { i_currentChar = fgetc(fi_file);//affecte à l'entier i_current le caractère lu (possible car il n'existe pas de type fort en C) while (i_currentChar != EOF) {//tant que nous ne sommes pas à la fin du fichier c_ch=i_currentChar;//affecte au caractère c_ch l'entier lu if(c_ch=='\n') {//si nous sommes à la fin de la ligne alors on ajoute la ligne lue dans le tableau de chaines de caractères après avoir alloué la mémoire de la future position de la chaine de caractère dans le tableau de chaines de caractères ppc_tab[i_cpt]=myMalloc(200*sizeof(char));//alloue la mémoire à la position où l'on ajouter la ligne lue depuis le fichier strcpy(ppc_tab[i_cpt],pc_line);//copie de la ligne lue dans le tableau de chaine de caractère *pc_line='\0';//efface tous les caractères présents dans la chaine de caractère pc_line i_cpt++;//incrémente le compteur de ligne i_cpt } else {//si nous ne sommes pas à la fin de la ligne, on concatène le caractère lue à la chaine de caractère pc_line sprintf(pc_line,"%s%c",pc_line,c_ch);//concatène le caractère lue à la chaine de caractère pc_line } i_currentChar = fgetc(fi_file);//lit le caractère suivant } } if(i_cpt<3) exitErrorNumberLine(pc_fileName);//si le nombre de ligne est inférieur à 3, le fichier flame est incorrect, on quitte donc le programme en affichant un message d'erreur free(pc_line);//libère l'espace mémoire alloué à la chaine de caractère pc_line fclose(fi_file);//ferme le flux fichier return (ppc_tab);//retourne le tableau de chaine de caractère } //Compte le nombre de ligne d'un fichier int numberOfLine(char* pc_fileName) { FILE* fi_file;//Pointeur vers le fichier dont on souhaite compter le nombre de ligne int i_currentChar;//entier correspondant au char en cours de lecture char c_currentChar;//caractère correspondant au char en cours de lecture int i_nbLine;//entier correspondant au nombre de ligne fi_file = fopen(pc_fileName, "r");//ouvre le fichier nommé par pc_fileName, retourne 0 si c'est un échec if(fi_file==0) {//si l'ouverture du fichier est un échec, on affiche un message d'erreur et on quitte le programme exitErrorFileName(pc_fileName, "IFS");//affiche un message d'erreur et quitte le programme } else { i_nbLine=0;//affecte la valeur 0 à l'entier i_nbLine correspondant au compteur de ligne i_currentChar = fgetc(fi_file);//affecte à l'entier i_currentChar le caractère lu while(i_currentChar != EOF) {//tant que nous ne sommes pas à la fin du fichier c_currentChar=i_currentChar;//affecte au caractère c_ch l'entier lu if(c_currentChar=='\n') {//si nous sommes à la fin de la ligne, on incrémente le nombre de ligne i_nbLine++;//incrémente le nombre de ligne } i_currentChar = fgetc(fi_file);//lit le caractère suivant } } fclose(fi_file);//ferme le fichier return (i_nbLine);//retourne le nombre de ligne du fichier }