Aller à la documentation de ce fichier.00001 #include <assert.h>
00002 #include "bib/io/LecteurFichier.hpp"
00003 
00004 #ifndef NDEBUG
00005 #include <iostream>
00006 #define MACRO_VERIF_FIN_ITERATEUR(X,Y) \
00007   if(iterateur == end) {\
00008   cout << "Impossible de " << X << " sur la ligne : " << Y << endl; \
00009           exit(0); \
00010   }
00011 
00012 using std::cout;
00013 using std::endl;
00014 #else
00015 #define MACRO_VERIF_FIN_ITERATEUR(X,Y)
00016 #endif
00017 
00018 namespace bib {
00019 namespace io {
00020 
00021 LecteurFichier::LecteurFichier(const string& cheminFichier):flux(cheminFichier.c_str(), ios::in),_asProchaineLigne(true)
00022 {
00023   
00024 #ifndef NDEBUG
00025     indexLigne = 0;
00026 
00027     if (!flux) {
00028         cout << "Le fichier " << cheminFichier << " ne peut être trouvé" << endl;
00029         exit(0);
00030     }
00031 #endif
00032     prochaineLigne();
00033 }
00034 
00035 LecteurFichier::~LecteurFichier(){
00036   flux.close();
00037 }
00038 
00039 bool LecteurFichier::asProchaineLigne()
00040 {
00041     return _asProchaineLigne;
00042 }
00043 
00044 
00045 void LecteurFichier::prochaineLigne(const string& delimiteur)
00046 {
00047     assert(asProchaineLigne());
00048 
00049     string ligne;
00050     if (getline(flux, ligne))
00051     {
00052         _asProchaineLigne = true;
00053         char_separator<char> _separateur ( delimiteur.c_str() );
00054         const Decoupeur decoupeur ( ligne, _separateur );
00055         iterateur = decoupeur.begin();
00056         end = decoupeur.end();
00057 #ifndef NDEBUG
00058         this->ligne = ligne;
00059         indexLigne++;
00060 #endif
00061     }
00062     else {
00063         _asProchaineLigne = false;
00064         flux.close();
00065     }
00066 }
00067 
00068 int LecteurFichier::lireInt()
00069 {
00070     MACRO_VERIF_FIN_ITERATEUR("lireInt",indexLigne)
00071 
00072     int i = atoi((*iterateur).c_str());
00073     ++iterateur;
00074     return i;
00075 }
00076 
00077 int LecteurFichier::lireIntVidePossible()
00078 {
00079     if(iterateur == end)
00080       return -1;
00081 
00082     int i = atoi((*iterateur).c_str());
00083     ++iterateur;
00084     return i;
00085 }
00086 
00087 string LecteurFichier::lireStringVidePossible()
00088 {
00089     if(iterateur == end)
00090       return "";
00091   
00092     string s = (*iterateur);
00093     ++iterateur;
00094     return s;
00095 }
00096 
00097 string LecteurFichier::lireString()
00098 {
00099     MACRO_VERIF_FIN_ITERATEUR("lireString",indexLigne)
00100 
00101     string s = (*iterateur);
00102     ++iterateur;
00103     return s;
00104 }
00105 
00106 bool LecteurFichier::lireBool()
00107 {
00108     MACRO_VERIF_FIN_ITERATEUR("lireBool",indexLigne)
00109 
00110     bool b = (*iterateur) != "0";
00111     ++iterateur;
00112     return b;
00113 }
00114 
00115 void LecteurFichier::allerSection(const string& section) {
00116 
00117     while (asProchaineLigne()){
00118         string s = lireStringVidePossible();
00119         
00120         
00121         if (s == "")
00122           prochaineLigne();
00123         else if(s == "["+section+"]")
00124             break;
00125     }
00126         
00127     prochaineLigne();
00128 }
00129 
00130 }
00131 }