// This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . # include using namespace std; //introduces namespace std #include #include "Sortie.h" #include "UtilLecture.h" #include "Sortie.h" #include #include #include #include #include "ParaGlob.h" #include "CharUtil.h" #include "TypeQuelconque.h" #include // méthodes de classe internes // surcharge de l'operateur d'ecriture ostream & operator << (ostream & sort,const UtilLecture::Position_BI & a) { // écriture du type sort << "incre_posi_(nb_et_posi): "; // les données sort << a.num_incr << " " ; // pour la position c'est plus délicat et peut-être pas portable ?? // normalement on a la position et un paramètre state ? // que l'on sauvegarde manuellement because pas de surcharge actuellement // () donne normalement l'ofset, et la fonction state() donne le state (?) streamoff errt = (streamoff) a.position; // utilisation de la conversion de type forcée #ifndef ENLINUX_STREAM sort << errt << " " << a.position.state() << " "; #else sort << errt; #endif return sort; }; // surcharge de l'operator de lecture istream & operator >> (istream & entree, UtilLecture::Position_BI& a) { // vérification du type string type; entree >> type; if (type != "incre_posi_(nb_et_posi):") {Sortie (1); return entree; }; // entrée des données entree >> a.num_incr; // en fait pour la position du stream il y a deux grandeurs (sur mac) // et on est obligé d'utiliser la surcharge standard de copie (?) // pour remplir a !! car // streampos contiend deux éléments sur mac !! qui sont en private !! // sur unix !!!!! a priori un seul élément #ifndef ENLINUX_STREAM {long long titi1; long long int titi2; entree >> titi1 >> titi2; streampos ee(titi1); ee.state(titi2); a.position = ee; } #else {long long titi1; entree >> titi1 ; streampos ee(titi1); a.position = ee; }; #endif return entree; }; // CONSTRUCTEURS : // il y a passage éventuelle d'argument : argc=le nombre d'argument // argv : donne un tableau correspondant de mots clés // ---> lecture de la racine du nom du fichier princial UtilLecture::UtilLecture (int argc, const char * argv[]) : longueur(1500) // longueur maxi du tableau de travail ,nomCourant(),nomRacine(),ptrfich(NULL),tablcar(NULL),tableau(NULL),lec_ent_info(-10) ,ent_BI(NULL),sort_BI(NULL),ent_PI(NULL),sort_PI(NULL),liste_posi_BI() ,dernier_increment_lu(0),ptrcommandefich(NULL),ptrschemaXMLfich(NULL) ,sort_princ_vrml(NULL),sort_legende_vrml(NULL),sort_princ_maple(NULL) ,sort__temps_cpu(NULL) ,sort_princ_geomview(NULL),sort_legende_geomview(NULL) ,sort_initial_Gid(NULL), sort_resultat_Gid(NULL) ,ent_CommandeVisu(NULL),sort_CommandeVisu(NULL) ,tablcarCVisu(NULL),tableauCVisu(NULL),maille1(NULL) ,ptnomCVisu(NULL),pteurnom(NULL),nomRacineCVisu() ,sort_initial_Gmsh(NULL),sort_resultat_Gmsh(),noms_base_fichiers_gmsh() ,tabMultiLignes(NULL) { bool fr = ParaGlob::Francais(); // pour simplifier // information concernant l'entrée des données if (fr){cout << "\n -- initialisation de l'entree des donnees ";} else {cout << "\n -- initialisation of the data input ";}; // tout d'abord on regarde qu'elle etait le nom utilise lors de la derniere // execution du programme ifstream auxi("ancienNom"); string ancien; bool ouverture_ancien=false; // on regarde l'utilisation de la sauvegarde de l'ancienne racine if (!auxi) //cas d'une erreur a l'ouverture parce que pas de fichier // lecture de la racine du nom du fichier princial { ouverture_ancien=false;} else { auxi >> ancien; // lecture de l'ancien nom // lecture de la racine du nom du fichier princial if (ancien.length() == 0) {ouverture_ancien=false;} else {ouverture_ancien=true;}; }; // on regarde maintenant s'il y a passage du nom dans les arguments lec_ent_info=-10; // init bool entree_par_argument= EntreeParArgument(argc,argv); // on regarde s'il y a eu pb et que rien n'est initialisé, il faut arrêter if (entree_par_argument) if (lec_ent_info==-100) return; // s'il n'y a pas eu d'entrée par argument on effectue une entrée interactive if (!entree_par_argument) EntreeInteractive(ancien,ouverture_ancien); // on regarde s'il y a eu pb et que rien n'est initialisé, il faut arrêter if (lec_ent_info==-100) return; // traitement en fonction de lec_ent_info switch (lec_ent_info) { case -12 : // --------- cas de la construction shema XML d'entrée de données .info ---- { if (fr) {cout << " racine du nom de fichier principal = " << nomRacine << endl;} else {cout << " first part of the name for the principal file = " << nomRacine << endl;}; // stockage du nom de fichier courant ouvert nomCourant = nomRacine; break; } case -11 : // --------- cas de la construction d'un fichier de commande .info ---- { if (fr) {cout << " racine du nom de fichier principal = " << nomRacine << endl;} else {cout << " first part of the name for the principal file = " << nomRacine << endl;}; // stockage du nom de fichier courant ouvert nomCourant = nomRacine; break; } case 0 : case 3: // ------------ cas d'une entrée via un fichier .info ---------- { if (fr) {cout << " racine du nom de fichier principal = " << nomRacine << endl;} else {cout << " first part of the name for the principal file = " << nomRacine << endl;}; // stockage du nom de fichier courant ouvert nomCourant = nomRacine; break; } case 1 : // --------------cas d'une entrée via un fichier .base-info------------ { if (fr) {cout << "\n entrer le nom du fichier .base-info : (" << ancien <<").base-info \n" << " ou repondre o ou 0 si l'on veut l'ancien nom (le dernier utilise)\n";} else {cout << "\n enter the name of the file .base-info : (" << ancien <<").base-info \n" << " or answer y or Y if you want the old name (last used) \n";}; nomRacine= lect_chaine(); if ((nomRacine == "0")||(nomRacine == "o")||(nomRacine == "y")||(nomRacine == "Y")) { nomRacine = ancien; // stockage du nom de fichier courant ouvert nomCourant = nomRacine; }; break; } case 2 : // --------------cas d'une entrée via un serveur .base-info------------ { if (fr) {cout << " cas actuellement non traite = entree de donnees via un serveur base-info \n";} else {cout << " at this time, not possible = input data with a server for file\n";}; cout << " UtilLecture::UtilLecture () " << endl; Sortie(1); break; } default : if (fr) {cout << "\nErreur : valeur incorrecte de lec_ent_info =" << lec_ent_info << " !\n";} else {cout << "\nError : incorrect value for lec_ent_info =" << lec_ent_info << " !\n";}; cout << "UtilLecture::UtilLecture () " << endl; Sortie(1); }; // sauvegarde de la racine dans le cas où on ne veut pas un schéma auxi.close(); if (lec_ent_info != -12) {ofstream auxo("ancienNom"); if (auxo) {auxo << nomRacine;} // sauvegarde de la racine else {if (fr) {cout << "pb en ouverture en ecriture du fichier , on continu quand meme ";} else {cout << "problem in the opening of the file but we continue as we can !! ";}; }; }; tablcar = new char [longueur] ; // def du tableau de travail tableau = new char [longueur] ; // def du tableau intermediaire tabMultiLignes = new char [longueur]; // def du tableau pour le stockage de plusieurs lignes // def du flot d'entree filtree en memoire // utilise pour les conversions de type en lecture #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,longueur) ; #else entree = new istrstream(tablcar,longueur) ; #endif // adressage du pointeur de nomRacine pteurnom = (char*)nomRacine.c_str(); nomRacineCVisu = nomRacine; // par défaut le nom de la racine de .CVisu est identique ptnomCVisu = (char*)nomRacineCVisu.c_str(); // lecture des commandes de visualisation (même technique en simplifié que pour .info) tablcarCVisu = new char [longueur] ; // def du tableau de travail tableauCVisu = new char [longueur] ; // def du tableau intermediaire // def du flot d'entree filtree en memoire // utilise pour les conversions de type en lecture #ifndef ENLINUX_STREAM entCVisu = new istringstream(tablcarCVisu,longueur) ; #else entCVisu = new istrstream(tablcarCVisu,longueur) ; #endif }; // DESTRUCTEUR : UtilLecture::~UtilLecture () { if (ptrfich!= NULL) {delete ptrfich;ptrfich=NULL;} if (ptrcommandefich!= NULL) {delete ptrcommandefich;ptrcommandefich=NULL;} if (ptrschemaXMLfich!= NULL) {delete ptrschemaXMLfich;ptrschemaXMLfich=NULL;} // ****** pour l'instant la suite ne marche pas ?? mais ce n'est pas normal // ****** erreur bizarre // c'est sans doute qu'il y a une confusion entre des vrais tableaux c de charactères = chaine de caractère // et le tableau du type caractère et je me demande s'il faut des destructeurs pour ce type de tableau //// = modif nov 2009 avec le passage sur linux .... il faudra regarder cela du plus près *************** // if (tablcar != NULL) {delete [] tablcar;tablcar=NULL;} //// if (tableau != NULL) {delete [] tableau;tableau=NULL;}; // if (tablcarCVisu != NULL) {delete [] tablcarCVisu;tablcarCVisu=NULL;} //// if (tableauCVisu != NULL) {delete [] tableauCVisu;tableauCVisu=NULL;}; //// if (tabMultiLignes != NULL) {delete [] tabMultiLignes; tabMultiLignes=NULL;}; Fermeture_base_info(); Fermeture_fichier_principal_vrml(); Fermeture_fichier_principal_vrml(); Fermeture_fichier_principal_maple(); Fermeture_fichier_principal_geomview(); Fermeture_fichier_principal_geomview(); Fermeture_fichier_initial_Gid(); Fermeture_fichier_resultat_Gid(); Fermeture_fichier_initial_Gmsh(); Fermeture_TousLesFichiersResultats_Gmsh(); Fermeture_fichier_temps_cpu(); } ; // ouverture du fichier principal principal de lecture int UtilLecture::OuvrirFichier () { char nomm[132]; char*fileName = nomm; bool fr = ParaGlob::Francais(); // pour simplifier strcpy(fileName, pteurnom); // traitement en fonction de lec_ent_info switch (lec_ent_info) { case -12 : // --------- cas de la construction shema XML d'entrée de données .info ---- { ptrschemaXMLfich = new ofstream(strcat(fileName,".xsd")); if(!(ptrschemaXMLfich->is_open())) { if (fr){cout << "\n erreur en ouverture du fichier " << fileName << endl;} else {cout << "\n error in opening of the file " << fileName << endl;}; Sortie(1); }; break; } case -11 : // ------------ cas d'une sortie via un fichier .info ---------- {// on va essayer d'éviter d'écraser un fichier déjà existant. // a) on essaie d'ouvrir le fichier en lecture ifstream * essai = new ifstream(strcat(fileName,".info")); string rep(" "); if (essai->is_open()) {// l'ouverture est ok ==> il existe déjà cout << "\n ****** attention, le fichier "< donc on termine l'execution "; Sortie(1); } else // sinon on veut vraiment l'écraser {essai->close(); }; // on ferme le fichier en lecture et on continue }; // cas où le fichier n'existe pas ou qu'on veut écraser un fichier existant // ptrcommandefich = new ofstream(strcat(fileName,".info")); ptrcommandefich = new ofstream(fileName); // fileName contient déjà le suffixe .info if(!(ptrcommandefich->is_open())) { if (fr){cout << "\n erreur en ouverture du fichier " << fileName << endl;} else {cout << "\n error in opening of the file " << fileName << endl;}; Sortie(1); }; break; } case 0 : // ------------ cas d'une entrée via un fichier .info ---------- { ptrfich = new ifstream(strcat(fileName,".info")); if(!(ptrfich->is_open())) { if (fr){cout << "\n erreur en ouverture du fichier " << fileName << endl;} else {cout << "\n error in opening of the file " << fileName << endl;}; Sortie(1); }; // initialisation de la liste chainee d'ouverture de fichier string no(fileName); maille1 = new PointFich (NULL,ptrfich,no); break; } case 1 : // --------------cas d'une entrée via un fichier .base-info------------ { Ouverture_base_info("lecture"); break; } case 2 : // --------------cas d'une entrée via un serveur .base-info------------ { if (fr){cout << " cas actuellement non traite = entree de données via un serveur base-info \n";} else {cout << " case not possible for the moment = input data with a server for file \n";}; cout << " UtilLecture::OuvrirFichier () " << endl; Sortie(1); break; } default : if (fr){cout << "\nErreur : valeur incorrecte de lec_ent_info =" << lec_ent_info << " !\n";} else {cout << "\nerror : incorrect value of lec_ent_info =" << lec_ent_info << " !\n";}; cout << "UtilLecture::OuvrirFichier () " << endl; Sortie(1); }; return lec_ent_info; }; // raffraichir le dernier fichier de lecture .info en cours // il y a fermeture puis ouverture au même endroit du fichier .info void UtilLecture::Raffraichir_pointInfo() { // on commence par récupérer l'adresse actuelle dans le fichier streampos position = maille1->sauvePtr->tellg(); // puis le nom string nom_du_pointInfo = maille1->nom; // on ferme le fichier delete maille1->sauvePtr; // on le reouvre maille1->sauvePtr = new ifstream(nom_du_pointInfo.c_str()); bool fr = ParaGlob::Francais(); // pour simplifier if(!(maille1->sauvePtr->is_open())) { if (fr){cout << "\n erreur en re-ouverture du fichier " << nom_du_pointInfo << endl;} else {cout << "\n error in re-opening of the file " << nom_du_pointInfo << endl;}; Sortie(1); }; // on se repositionne dans le fichier maille1->sauvePtr->clear(); // on remet à 0 les bits de contrôle au cas où maille1->sauvePtr->seekg(position, ios::beg); }; // fermeture du fichier .info void UtilLecture::fermeture_pointInfo() { if (ptrcommandefich!= NULL) {delete ptrcommandefich;ptrcommandefich=NULL;} }; // fermeture du fichier SchemaXML void UtilLecture::fermetureSchemaXML() { if (ptrschemaXMLfich!= NULL) {delete ptrschemaXMLfich;ptrschemaXMLfich=NULL;} }; // ouverture du fichier de copie des infos lue par le programme void UtilLecture::OuvrirCopie() { char noml[132]; char*fileName = noml; strcpy(fileName, pteurnom); copie = new ofstream(strcat(fileName,".copie")); if(!(copie->is_open())) { cout << "\n erreur en ouverture du fichier de copie " << fileName << endl; Sortie(1); }; }; //fermeture du fichier de copie des infos lue par le programme void UtilLecture::FermerCopie() { delete copie; }; // lecture d'une nouvelle ligne de donnee utilisable pour l'entree de donnee void UtilLecture::NouvelleDonnee() { int indicboucle = 0; // indicateur pour sortir de la boucle globale int indicfichier = 0 ; // indicateur pour la fermeture de fichier try { while (indicboucle == 0) { Nouvel_enreg(); // lecture d'un enreg ds le fichier courant char* pentree ; // position du carractere "<" pentree = strchr(tablcar,'<'); // position eventurelle de "<" if ( pentree != NULL) { pentree++;NouveauFichier(pentree); } else { indicboucle = 1; }; }; // on repositionne le flot au debut du tableau de carractere // ouverture du flot a la longueur sans blanc delete entree; #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,strlen (tablcar)) ; #else entree = new istrstream(tablcar,(long)strlen (tablcar)) ; #endif } // sortie normale du programme catch (ErrNouvelEnreg erreur) { if ( erreur.lecture == 1) // on a atteind une fin de fichier { int indic; FermetureFichier(indic); if (indic == 0) // cas ou il reste encore un fichier ouvert { NouvelleDonnee(); // appel recursif de la lecture // on repositionne le flot au debut du tableau de carractere // ouverture du flot a la longueur sans blanc delete entree; #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,strlen (tablcar)) ; #else entree = new istrstream(tablcar,(long)strlen (tablcar)) ; #endif } else throw (ErrNouvelleDonnee(1)); // fin de tous les fichiers atteind } else throw (ErrNouvelleDonnee(-1)); // erreur en fermeture de fichier } }; // idem avec la méthode NouvelleDonnee() // mais sans ouverture de fichier automatique // le signe < est conservé dans la ligne void UtilLecture::NouvelleDonneeSansInf() { int indicboucle = 0; // indicateur pour sortir de la boucle globale int indicfichier = 0 ; // indicateur pour la fermeture de fichier try { while (indicboucle == 0) { Nouvel_enreg(); // lecture d'un enreg ds le fichier courant indicboucle = 1; }; // on repositionne le flot au debut du tableau de carractere // ouverture du flot a la longueur sans blanc delete entree; #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,strlen (tablcar)) ; #else entree = new istrstream(tablcar,(long)strlen (tablcar)) ; #endif } // sortie normale du programme catch (ErrNouvelEnreg erreur) { if ( erreur.lecture == 1) // on a atteind une fin de fichier { int indic; FermetureFichier(indic); if (indic == 0) // cas ou il reste encore un fichier ouvert { NouvelleDonnee(); // appel recursif de la lecture // on repositionne le flot au debut du tableau de carractere // ouverture du flot a la longueur sans blanc delete entree; #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,strlen (tablcar)) ; #else entree = new istrstream(tablcar,(long)strlen (tablcar)) ; #endif } else throw (ErrNouvelleDonnee(1)); // fin de tous les fichiers atteind } else throw (ErrNouvelleDonnee(-1)); // erreur en fermeture de fichier }; }; // Retour du flot au debut de l'enregistrement void UtilLecture::FlotDebutDonnee() {// on repositionne le flot au debut du tableau de carractere delete entree; #ifndef ENLINUX_STREAM entree = new istringstream(tablcar,strlen (tablcar)) ; #else entree = new istrstream(tablcar,(long) strlen (tablcar)) ; #endif }; // ecriture d'un message d'erreur du a une mauvaise lecture void UtilLecture::ErreurLecture (UtilLecture::ErrNouvelleDonnee erreur,char* message) { cout << "\n***** erreur en lecture *********"<< '\n'; cout << message << '\n'; if ( erreur.lecture == 1) { cout << " fin de fichier atteinte" << '\n'; } else if ( erreur.lecture == -1 ) { cout << "erreur de lecture \n";} else cout << " cas non prevu\n " ; cout << " contenu de la ligne courante filtree lue " << tablcar << '\n'; cout << " contenu de la ligne courante non filtree lue " << tableau << '\n'; cout << "racine du fichier principal = " << nomRacine << '\n'; cout << " fichier courant ouvert en lecture = " << nomCourant << '\n'; cout << " numero de la ligne courante = " << maille1->numLigne << '\n'; cout << endl; }; // ecriture d'un message et du contenu des buffers courant void UtilLecture::MessageBuffer(string message) { cout << "\n****** " << message << "******** " << '\n'; cout << "\n** information sur les buffers **"<< '\n'; cout << " contenu de la ligne courante filtree lue = " << tablcar << '\n'; cout << " contenu de la ligne courante non filtree lue = " << tableau << '\n'; cout << "racine du fichier principal = " << nomRacine << '\n'; cout << " fichier courant ouvert en lecture = " << nomCourant << '\n'; if (maille1 != NULL) cout << " numero de la ligne courante = " << maille1->numLigne << '\n'; cout << endl; }; // recherche d'une chaine de carractere pointee par nom void UtilLecture::Cherche(const char * nom) { do { NouvelleDonnee(); } while(strstr(tablcar,nom)==NULL); }; // ouverture d'un nouveau fichier void UtilLecture::NouveauFichier(char* ptr) { ifstream * sPtr = ptrfich; // sauve de l'adresse // passage des carracteres "espace" eventuelle int fii = 1; while((*ptr == ' ')&&(fiiis_open())) { if (ParaGlob::Francais()) {cout << " cas d'un fichier decrit par la commande < " << '\n' << " erreur en ouverture du fichier = " << (string(ptr)) << endl; } else {cout << " case of an include file, introduced by the command < " << '\n' << " error in opening the file = " << (string(ptr)) << endl; }; Sortie(1); }; // ajout d'un maillon a la liste chainee d'ouverture de fichier PointFich* poi = maille1; maille1 = new PointFich (poi,sPtr,nomCourant); }; // fermeture d'un fichier void UtilLecture::FermetureFichier(int& indic) { // retour sur le fichier precedent si possible if (maille1->t1 != NULL) { delete ptrfich; //fermeture du fichier ptrfich = maille1->sauvePtr; // recup de l'adresse fichier PointFich* poi = maille1->t1; // sauve adresse precedente delete maille1; // suppression de la maille courante maille1 = poi; // et pointage sur la maille precedente nomCourant = maille1->nom; // mise a jour du nomcourant de fichier ouvert indic = 0; // operation reussie } else indic = 1; // fin des fichiers intermediaires atteinte }; // affichage sur la sortie standard de l'enregistrement courant void UtilLecture::AfficheEnreg () const { cout << tablcar << '\n'; }; // entrée par argument au niveau de la construction de l'objet UtilLecture // dans le cas où il y a eu un pb lec_ent_info=-100, et rien n'est initialisé bool UtilLecture::EntreeParArgument(int argc, const char * argv[]) { // on regarde maintenant s'il y a passage par arguments // le premier argument est le nom du programme qui est lancé (semblerait-il) // donc se qui nous intéresse c'est les arguments suivants bool entree_par_argument=false; // par défaut on signale que l'on est en mode de demande de renseignement d'UtilLecture // mais rien n'est initialisé, il faut arrêter if (argc > 1) lec_ent_info=-100; // initialisation par défaut // === cas où il y a qu'un seul argument === if (argc==2) {int i=1;entree_par_argument=true; if (argv[i][1]=='f') // -- cas d'une entrée par fichier, il faudrait un second argument { cout << "\n usage: -f " << endl; } else if (argv[i][1]=='n') // -- cas de la construction d'un fichier, il faudrait un second argument { cout << "\n usage: -n " << endl; } else if (argv[i][1]=='x') // -- cas de la construction du shema xml d'entree de donnees { entree_par_argument=true; lec_ent_info = -12; nomRacine="Herezhpp"; // nom prédéterminé } else if (argv[i][1]=='u') // -- cas de l'utilisation d'herezh sous forme d'une procédure umat abaqus // il faudrait un autre argument { cout << "\n usage: -uf " << endl; } else if (argv[i][1]=='h') // -- cas du rappel de l'usage { cout << "\n usage: HZpp -[fnxh] " << "\n -h rappel de l'usage" << "\n -f execution avec le fichier de commande qui suit" << "\n -x creation du schema XML pour fichier de commande: Herezhpp.xsd" << "\n -n creation interactive d'un fichier de commande"; } } else // === cas où il y a plusieurs arguments === {for (int i=1;i< argc;i++) {if (argv[i][1]=='f') // -- cas d'une entrée par fichier {if(i" << endl; } break; // pour l'instant une seule passe } else if (argv[i][1]=='n') // -- cas de la construction d'un fichier {if(i" << endl; } break; // pour l'instant une seule passe } else if (argv[i][1]=='x') // -- cas de la construction d'un shema xml d'entree de donnees { cout << "\n usage: -x " << endl; break; } else if (argv[i][1]=='h') // -- cas du rappel de l'usage { cout << "\n usage: HZpp -[fnxh] " << "\n -h rappel de l'usage" << "\n -f execution avec le fichier de commande qui suit" << "\n -x creation d'un schema XML pour fichier de commande: Herezhpp.xsd" << "\n -n creation interactive d'un fichier de commande"; break; // pour l'instant une seule passe } }; }; // retour return entree_par_argument; }; // entrée interactive au niveau de la construction de l'objet UtilLecture // dans le cas où il y a eu un pb lec_ent_info=-100, et rien n'est initialisé void UtilLecture::EntreeInteractive(string& ancien,bool& ouverture_ancien) { // entrée interactive if (!ouverture_ancien) // pas de possibilité d'utilisation de racine déjà existante { nomRacine = ""; while (!((nomRacine.length () != 0) || (nomRacine == "1") || (nomRacine == "2"))) { cout << "\n pb en ouverture en lecture du fichier : ancien" << " , on continu quand meme "; cout << "\n entrer la racine du nom du fichier .info :\n" << " ou repondre 1 pour une entree via le fichier base-info\n" << " ou repondre 2 pour une entree via un serveur base-info\n" << " ou repondre x pour la creation d'un schema XML pour creer\n" << " un fichier de commade: Herezhpp.xsd\n" << " ou repondre n pour la construction d'un nouveau fichier de commande\n"; nomRacine= lect_chaine(); if (nomRacine == "1") lec_ent_info = 1; else if (nomRacine == "2") lec_ent_info = 2; else if (nomRacine == "n") {lec_ent_info = -11; cout << "\n entrer la racine du nom du fichier de commande a cree : \n"; nomRacine= lect_chaine(); } else if (nomRacine == "x") {lec_ent_info = -12; cout << "\n ====================================== \n"; cout << "\n $$$$$ construction du schema XML $$$$ \n"; cout << "\n $$$$$ fichier: Herezhpp.xsd $$$$ \n"; cout << "\n ====================================== \n"; nomRacine="Herezhpp"; } else lec_ent_info = 0; } } else // utilisation de la racine existante { nomRacine = ""; while (!((nomRacine.length () != 0) || (nomRacine == "0") || (nomRacine == "o") || (nomRacine == "1") || (nomRacine == "2"))) { cout << "\n entrer la racine du nom du fichier .info : (" << ancien <<").info \n" << " ou repondre o ou 0 si l'on veut l'ancien nom \n" << " ou repondre 1 pour une entree via le fichier base-info\n" << " ou repondre 2 pour une entree via un serveur base-info\n" << " ou repondre x pour la creation d'un schema XML pour creer\n" << " un fichier de commade: Herezhpp.xsd\n" << " ou repondre n pour la construction d'un nouveau fichier de commande\n"; nomRacine= lect_chaine(); if (nomRacine == "1") lec_ent_info = 1; else if (nomRacine == "2") lec_ent_info = 2; else if ((nomRacine == "0")||(nomRacine == "o")) { lec_ent_info = 0; nomRacine = ancien; } else if (nomRacine == "n") {lec_ent_info = -11; cout << "\n entrer la racine du nom du fichier de commande a cree : \n"; nomRacine= lect_chaine(); } else if (nomRacine == "x") {lec_ent_info = -12; cout << "\n ====================================== \n"; cout << "\n $$$$$ construction du schema XML $$$$ \n"; cout << "\n $$$$$ fichier: Herezhpp.xsd $$$$ \n"; cout << "\n ====================================== \n"; nomRacine="Herezhpp"; } else if (nomRacine.length () != 0) lec_ent_info = 0; } }; // dans le cas où ".info" figure dans la racine, on supprime cette chaine int posi = nomRacine.find(".info"); if (posi != string::npos) { string nom_inter = nomRacine.substr(0,posi); nomRacine = nom_inter; }; }; //------------- utilitaires de lecture d'une grandeurs qui peut-être une constante utilisateur --- double UtilLecture::lect_avec_const_double_utilisateur(string nom_erreur) const {string nom; double val; // le retour *entree >> nom ; // on regarde si les 3 premières lettres sont C__ if ((nom[0]== 'C')&&(nom[1]== '_')&&(nom[2]== '_')) // il s'agit d'une constante utilisateur, on récupère sa valeur { // on récupère le pointeur correspondant à la grandeur const void* pointe = (ParaGlob::param->GrandeurGlobal(nom)); if (pointe != NULL) {TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe); if ((gr_quelc->Grandeur_pointee()->Type_structure_grandeurAssocie()==TYPE_SIMPLE) && (gr_quelc->Grandeur_pointee()->Type_enumGrandeurParticuliere()==PARTICULIER_SCALAIRE_DOUBLE) ) {val = gr_quelc->Grandeur_pointee()->GrandeurNumOrdre(1); } else // sinon pb { cout << "\n *** pb dans dans l'utilisation de la constante globale "<< nom << " le conteneur lu " << nom << " n'est pas d'un type correct !! " << "\n >>> lecture : " << nom_erreur; if (ParaGlob::NiveauImpression() > 3) cout << "\n UtilLecture::Lect_avec_const_double_utilisateur(..."; Sortie(1); }; } else // sinon pb { cout << "\n *** erreur dans l'utilisation de la constante globale "<< nom << " la variable n'existe pas !! " << "\n >>> lecture : " << nom_erreur << "\n >>> lecture : " << nom_erreur; if (ParaGlob::NiveauImpression() > 3) cout << "\n UtilLecture::Lect_avec_const_double_utilisateur(..."; Sortie(1); }; } else // c'est directement une valeur, on traduit {val = ChangeReel(nom);}; // retour de la valeur return val; }; // modification interactive d'une constante utilisateur // la constante doit déjà exister void UtilLecture::Modif_interactive_constante_utilisateur() { try {string nom; cout << "\n nom de la constante utilisateur a modifier ? "; cin >> nom ; cout << " (nom lu: "<< nom << ") "; // on regarde si les 3 premières lettres sont C__ if ((nom[0]== 'C')&&(nom[1]== '_')&&(nom[2]== '_')) // il s'agit d'une constante utilisateur, on récupère sa valeur { // on récupère le pointeur correspondant à la grandeur const void* pointe = (ParaGlob::param->GrandeurGlobal(nom)); if (pointe != NULL) {TypeQuelconque* gr_quelc = (TypeQuelconque*) (pointe); // récup du typeQuelconque const TypeQuelconque_enum_etendu& enu = gr_quelc->EnuTypeQuelconque(); if (enu == GENERIQUE_UNE_CONSTANTE_GLOB_DOUBLE_UTILISATEUR) {if ((gr_quelc->Grandeur_pointee()->Type_structure_grandeurAssocie()==TYPE_SIMPLE) && (gr_quelc->Grandeur_pointee()->Type_enumGrandeurParticuliere()==PARTICULIER_SCALAIRE_DOUBLE) ) {// valeur initiale double val_init = gr_quelc->Grandeur_pointee()->GrandeurNumOrdre(1); // lecture de la nouvelle valeur double nevezval; cout << "\n valeur actuelle " << val_init << " nouvelle valeur ? " ; cin >> nevezval; if (ParaGlob::NiveauImpression() > 0) {cout << "\n modification de la constante utilisateur : "<< nom; cout << " ancienne valeur " << val_init; cout << " nouvelle valeur lue "<< nevezval ; }; ParaGlob::param->Mise_a_jour_grandeur_consultable_Scalaire_double(nom,nevezval); } else // sinon pb { cout << "\n *** pb dans dans la modification de la constante utilisateur "<< nom << " le conteneur lu " << nom << " n'est pas d'un type correct !! "; if (ParaGlob::NiveauImpression() > 3) cout << "\n UtilLecture::Modif_interactive_constante_utilisateur(..."; Sortie(1); }; } else // cas ou on a détecter que la grandeur globale n'est pas une constante utilisateur { cout << "\n *** erreur dans l'utilisation de la grandeur globale "<< nom << " ce n'est pas une constante utilisateur !! " << " *** on ne change rien " ; if (ParaGlob::NiveauImpression() > 3) cout << "\n UtilLecture::Modif_interactive_constante_utilisateur(..."; cout < 3) cout << "\n UtilLecture::Modif_interactive_constante_utilisateur(..."; cout < 3) cout << "\n UtilLecture::Modif_interactive_constante_utilisateur(..."; cout < 3) cout << "\n UtilLecture::Modif_interactive_constante_utilisateur(..."; cout <::max(), '\n' );// purge de cin };