// FICHIER : Lecture_reference.cp #include #include #include #include #include #include "Lect_reference.h" Tableau Lect_reference (char* nom_fichier) // LECTURE DES REFERENCES DU MAILLAGE ET STOCKAGE DE TOUTES LES // REFERENCES DANS UN TABLEAU { FILE* fichier; char ligne[80]; // *** Ouverture du fichier de donnees *** if ( (fichier=fopen(nom_fichier,"r"))==NULL ) { cout << "ERREUR D'OUVERTURE DU FICHIER :"; cout << nom_fichier << "\n"; exit(1); }; // *** Calcul du nombre de reference *** // ( et sauvegarde de l'indicateur de position des lignes // du fichier ou sont definies des references ) unsigned long int position=0; //indicateur de position dans le fichier lu Liste liste_posit; // liste contenant des positions correspondant // a la definition d'une reference // num_ligne est le numero de la derniere ligne lue (utile pour // les messages d'erreur) int num_ligne=0; // Parcours de l'ensemble du fichier et stockage dans liste_posit_ref // des indicateurs de position while ( feof(fichier)==0 ) { position=ftell(fichier);// sauvegarde dans position de la position // courante dans le fichier num_ligne=num_ligne+1; if ( (fgets(ligne,80,fichier)==NULL) && (feof(fichier)==0) ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Numero de la derniere ligne lue correctement :"; cout << (num_ligne-1) << "\n"; exit(1); }; if ( (strstr(ligne,"N_R")!=NULL) || (strstr(ligne,"E_R")!=NULL) || (strstr(ligne,"F_R")!=NULL) || (strstr(ligne,"A_R")!=NULL) ) // presence d'un nom de reference liste_posit.Ajout(position); ligne[0]='\0'; }; if ( liste_posit.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "Aucune reference n'a ete trouve !\n"; }; // *** Lecture des noms et des numeros des references *** // *** Stockage des informations dans tab_ref *** rewind(fichier); Tableau tab_ref(liste_posit.Nombre()); // Positionnement sur le premier element de liste_posit liste_posit.Debut(); // Placement de l'indicateur de position sur une ligne // definissant une reference et lecture des donnees de la // reference errno=0; for (int i=1;i<=liste_posit.Nombre();i++) { char nom_ref[10]; int numero=0; Liste liste_num; // liste des numeros d'une reference fseek(fichier,liste_posit.Element(),SEEK_SET); fscanf(fichier,"%10s",nom_ref); // lecture du nom de la reference if ( feof(fichier)!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER :"; cout << nom_fichier << "\n"; cout << "Fin du fichier atteinte avant la lecture"; cout << " totale des donnees !\n"; exit(1); }; if ( errno!=0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; if ( i>1 ) { cout << "Nom de la derniere reference lue correctement : "; cout << tab_ref(i-1).Nom() << "\n"; exit(1); } else { cout << "Probleme de lecture de la premiere reference\n"; exit(1); }; }; while ( fscanf(fichier,"%d", &numero)==1 ) // lecture des numeros d'une reference et stockage dans liste_num liste_num.Ajout(numero); if ( liste_num.Nombre()==0 ) { cout << "ERREUR DE LECTURE DU FICHIER : "; cout << nom_fichier << "\n"; cout << "La reference de nom " << nom_ref << " est vide \n"; }; Tableau tab_num(liste_num.Nombre()); liste_num.Debut(); for (int j=1;j<=liste_num.Nombre();j++) // stockage a partir de la liste des numeros liste_num de l'ensemble // des numeros d'une reference dans le tableau tab_num { tab_num(j)=liste_num.Element(); liste_num.Suivant(); }; Reference ref(tab_num,nom_ref); tab_ref(i)=ref; // sauvegarde de l'ensemble des donnees d'une reference dans tab_ref liste_posit.Suivant(); }; // *** Fermeture du fichier de donnees *** if ( fclose(fichier)==-1 ) { cout << " ERREUR DE FERMETURE DU FICHIER "; cout << nom_fichier << "\n"; exit(1); }; // *** Renvoie du tableau de reference *** return tab_ref; };