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 }