magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
14 févr. 2005 à 14:05
j'ai une classe qui fait ça....
c'est pour eVC (PDA) mais ça marchera directement sur VC je pense.
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif /* _DEBUG */
#include "stdafx.h"
//#include "QualiTel.hpp"
#include "GestionFichierIni.hpp"
BFichierIniPDA::BFichierIniPDA(LPCTSTR lpFileName)
{
/// ------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::BFichierIniPDA(LPCTSTR lpFileName) ----------------
/// ------------------------------------------------------------------------------------
/// ----- Objectif : Constructeur de la classe : BFichierIniPDA
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PostCond : Toutes les variables de la classe doivent être instanciées avec une valeur par défaut ou contextuelle
/// ----- Etat : 1 (-1<0<1<2)
/// ------------------------------------------------------------------------------------
/// ----- LPCTSTR lpFileName : Chemin complet + nom du fichier de style INI
/// ------------------------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sNomFichier
/// ----- Var Muettes (cf.partie préc) (1) : lpFileName
/// ----- Var In (1) : lpFileName
/// ----- Var Out (1) : m_sNomFichier
m_sNomFichier=lpFileName;
// Création de la map en lisant le fichier
initArbre();
}
BFichierIniPDA::~BFichierIniPDA()
{
/// -------------------------------------------------------------------
/// ---------------- BFichierIniPDA::~BFichierIniPDA() ----------------
/// -------------------------------------------------------------------
/// ----- Objectif : Destructeur de la classe : BFichierIniPDA
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PostCond : Toutes les variables de la classe sont détruites
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------------
m_mapValeurs.RemoveAll();
}
bool BFichierIniPDA::lireLigne()
{
/// ---------------------------------------------------------------------
/// ---------------- BFichierIniPDA::lireLigne() -> bool ----------------
/// ---------------------------------------------------------------------
/// ----- Objectif : Lire une ligne du fichier
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ---------------------------------------------------------------------
/// ----- retour (bool) : succès
/// ---------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sContenuLigne
/// ----- Var Internes à la fonction (3) : c ,l_bFinBoucle ,nbRead
/// ----- Var In Globales Constantes (1) : WCHAR
/// ----- Var Out (1) : m_sContenuLigne
bool l_bFinBoucle=false;
m_sContenuLigne.Empty();
int nbRead=0;
while(l_bFinBoucle!=true)
{
unsigned char c;
nbRead=m_fichier.Read(&c,1);
if(nbRead==1)
{
if(c==10)
/// algo : fin de ligne
l_bFinBoucle=true;
else
if(c!=13)
/// algo : ignorer '\r'
m_sContenuLigne+=(WCHAR)c;
}
else
/// algo : fin de fichier
l_bFinBoucle=true;
}
return(nbRead==1 || m_sContenuLigne.GetLength()>0);
}
bool BFichierIniPDA::isSection()const
{
/// ---------------------------------------------------------------------
/// ---------------- BFichierIniPDA::isSection() -> bool ----------------
/// ---------------------------------------------------------------------
/// ----- Objectif : Teste si la ligne est une section
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ---------------------------------------------------------------------
/// ----- retour (bool) : section?
/// ---------------------------------------------------------------------
return(!m_sContenuLigne.IsEmpty() && m_sContenuLigne.GetAt(0)=='[');
}
bool BFichierIniPDA::isCommentaire()const
{
/// -------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::isCommentaire() -> bool ----------------
/// -------------------------------------------------------------------------
/// ----- Objectif : Teste si la ligne est un commentaire
/// ----- Explic : commentaire = ligne commençant par ";"
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------------------
/// ----- retour (bool) : cf objectif
/// -------------------------------------------------------------------------
return(!m_sContenuLigne.IsEmpty() && m_sContenuLigne.GetAt(0)==';');
}
void BFichierIniPDA::addEntree()
{
/// -------------------------------------------------------------
/// ---------------- BFichierIniPDA::addEntree() ----------------
/// -------------------------------------------------------------
/// ----- Objectif : Ajouter une entrée dans la map du fichier
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------
/// ----- Var Utilisées de la classe (3) : m_sCle ,m_sValeurEntree ,m_tailleArbre
/// ----- Var Internes à la fonction (1) : cle
/// ----- Var In (3) : m_sCle ,m_sValeurEntree ,m_tailleArbre
m_tailleArbre++;
CString cle=getNomSection()+';';
cle+=m_sCle;
m_mapValeurs.SetAt(cle,m_sValeurEntree);
}
void BFichierIniPDA::initArbre()
{
/// -------------------------------------------------------------
/// ---------------- BFichierIniPDA::initArbre() ----------------
/// -------------------------------------------------------------
/// ----- Objectif : Lecture du fichier et création de la map représentant l'arbre du fichier
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------
/// ----- Var : classes externes dont on appelle des méthodes (1) : CFile
/// ----- Var Utilisées de la classe (7) : m_isOpen ,m_sCle ,m_sContenuLigne ,m_sNomFichier ,m_sSection ,m_sValeurEntree ,m_tailleArbre
/// ----- Var In (2) : m_sContenuLigne ,m_sNomFichier
/// ----- Var In Globales (1) : modeRead
/// ----- Var Out (5) : m_isOpen ,m_sCle ,m_sSection ,m_sValeurEntree ,m_tailleArbre
m_tailleArbre=0;
m_mapValeurs.RemoveAll();
m_isOpen=(0!=m_fichier.Open(m_sNomFichier,CFile::modeRead));
if(m_isOpen)
{
// Génération de la map des valeurs
while(lireLigne())
if(!m_sContenuLigne.IsEmpty() && !isCommentaire())
if(isSection())
m_sSection=m_sContenuLigne;
else
{
// On est sur une entrée potentielle
int positionEgale=m_sContenuLigne.Find('=');
if(positionEgale>=0)
{
// On est sur une entrée!
m_sCle=m_sContenuLigne.Left(positionEgale);
m_sValeurEntree=m_sContenuLigne.Mid(positionEgale+1);
addEntree();
}
}
m_fichier.Close();
}
}
void BFichierIniPDA::copyArbre(LPCTSTR nomFichier)
{
/// -------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::copyArbre(LPCTSTR nomFichier) ----------------
/// -------------------------------------------------------------------------------
/// ----- Objectif : Recopier la map dans le fichier d'origine
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ----- TODO : prise en compte des commentaires !!!
/// -------------------------------------------------------------------------------
/// ----- LPCTSTR nomFichier : Chemin complet + nom du fichier de style INI
/// -------------------------------------------------------------------------------
/// ----- Var : classes externes dont on appelle des méthodes (1) : CFile
/// ----- Var Utilisées de la classe (1) : m_isOpen
/// ----- Var Muettes (cf.partie préc) (1) : nomFichier
/// ----- Var Internes à la fonction (11) : l_Index1 ,l_Index2 ,l_iIndex ,l_iPositionVirgule ,l_sBuffer ,l_sCle ,l_sIdentifiant ,l_sMapBuffer ,l_sSection ,l_sValeur ,l_usCaractere
/// ----- Var In (1) : nomFichier
/// ----- Var In Globales (2) : modeCreate ,modeWrite
/// ----- Var Out (1) : m_isOpen
/// algo : Réinit a 0 du fichier si il existe, sinon création du fichier Accés en écriture
m_isOpen=(0!=m_fichier.Open(nomFichier,CFile::modeCreate|CFile::modeWrite));
if(m_isOpen)
{
CMapStringToString l_sMapBuffer;
CString l_sValeur,l_sIdentifiant,l_sSection,l_sCle,l_sBuffer;
POSITION l_Index1,l_Index2;
int l_iPositionVirgule,l_iIndex;
unsigned short l_usCaractere;
/// algo : Récup toutes les sections
l_sMapBuffer.RemoveAll();
l_Index1=m_mapValeurs.GetStartPosition();
while(l_Index1 != NULL)
{
m_mapValeurs.GetNextAssoc(l_Index1,l_sIdentifiant,l_sValeur);
// contenu de l_sKey -> section;clé
l_iPositionVirgule=l_sIdentifiant.Find(';');
l_sSection=l_sIdentifiant.Left(l_iPositionVirgule);
l_sMapBuffer.SetAt(l_sSection,NULL);
}
/// algo : Copie les sections dans le fichier
l_Index1=l_sMapBuffer.GetStartPosition();
while(l_Index1 != NULL)
{
l_sMapBuffer.GetNextAssoc( l_Index1,l_sSection,l_sValeur);
m_fichier.Write("[",1);
// Copie caractère par caractère
for(l_iIndex=0;l_iIndex<l_sSection.GetLength();l_iIndex++)
{
l_usCaractere=l_sSection.GetAt(l_iIndex);
m_fichier.Write(&l_usCaractere,1);
}
m_fichier.Write("]",1);
m_fichier.Write("\r\n",2);
/// algo : Pour chaques sections
l_Index2=m_mapValeurs.GetStartPosition();
while(l_Index2 != NULL)
{
/// algo : Recherche de chaques clés et valeurs associées à cette section
/// algo : copie dans le fichier
m_mapValeurs.GetNextAssoc(l_Index2,l_sIdentifiant,l_sValeur);
// contenu de l_sKey -> section;clé
l_iPositionVirgule=l_sIdentifiant.Find(';');
/// algo : Si c'est la bonne section
if(l_sSection.Compare(l_sIdentifiant.Left(l_iPositionVirgule))==0)
{
/// algo : écrit la clé et la valeur ds le fic
l_sCle=l_sIdentifiant.Mid(l_iPositionVirgule+1,l_sIdentifiant.GetLength()-1);
// Copie caractère par caractère
for(l_iIndex=0;l_iIndex<l_sCle.GetLength();l_iIndex++)
{
l_usCaractere=l_sCle.GetAt(l_iIndex);
m_fichier.Write(&l_usCaractere,1);
}
m_fichier.Write("=",1);
// Copie caractère par caractère
for(l_iIndex=0;l_iIndex<l_sValeur.GetLength();l_iIndex++)
{
l_usCaractere=l_sValeur.GetAt(l_iIndex);
m_fichier.Write(&l_usCaractere,1);
}
m_fichier.Write("\r\n",2);
}
}
m_fichier.Write("\r\n",2);
}
m_fichier.Close();
}
}
CString BFichierIniPDA::getNomSection()const
{
/// ----------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::getNomSection() -> CString ----------------
/// ----------------------------------------------------------------------------
/// ----- Objectif : Récupérer le nom de la section
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ----------------------------------------------------------------------------
/// ----- retour (CString) : Nom de la section sans crochets
/// ----------------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sSection
/// ----- Var Internes à la fonction (1) : nomSection
/// ----- Var In (1) : m_sSection
CString nomSection=m_sSection;
nomSection.Remove('[');
nomSection.Remove(']');
return(nomSection);
}
int BFichierIniPDA::get(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefault,LPTSTR lpReturnedString)const
{
/// ----------------------------------------------------------------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::get(LPCTSTR lpAppName ,LPCTSTR lpKeyName ,LPCTSTR lpDefault ,LPTSTR lpReturnedString) -> int ----------------
/// ----------------------------------------------------------------------------------------------------------------------------------------------
/// ----- Objectif : Lire une chaine dans un fichier de style INI
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ----------------------------------------------------------------------------------------------------------------------------------------------
/// ----- LPCTSTR lpAppName : section
/// ----- LPCTSTR lpKeyName : clef
/// ----- LPCTSTR lpDefault : Valeur par défaut
/// ----- LPTSTR lpReturnedString : Pointeur sur buffer qui va contenir la valeur lue
/// ----------------------------------------------------------------------------------------------------------------------------------------------
/// ----- retour (int) : Taille de la chaine lue
/// ----------------------------------------------------------------------------------------------------------------------------------------------
/// ----- Var Muettes (cf.partie préc) (4) : lpAppName ,lpDefault ,lpKeyName ,lpReturnedString
/// ----- Var Internes à la fonction (3) : cle ,l_iValeurRetour ,valeur
/// ----- Var Utilisées par adresse (1) : lpReturnedString
/// ----- Var In (3) : lpAppName ,lpDefault ,lpKeyName
/// ----- Var In-Out (1) : lpReturnedString
int l_iValeurRetour=0;
CString cle=lpAppName;
cle+=';';
cle+=lpKeyName;
CString valeur;
if(m_mapValeurs.Lookup(cle,valeur))
{
// on a bien trouvé l'entrée
wcsncpy(lpReturnedString,valeur,valeur.GetLength());
// Ajout du caractère de fin de chaine
lpReturnedString[valeur.GetLength()]='\0';
l_iValeurRetour=valeur.GetLength();
}
else // On n'a pas trouve l'entrée
wcsncpy(lpReturnedString,lpDefault,wcslen(lpDefault));
return(l_iValeurRetour);
}
void BFichierIniPDA::set(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString)
{
/// -------------------------------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::set(LPCTSTR lpAppName ,LPCTSTR lpKeyName ,LPCTSTR lpString) ----------------
/// -------------------------------------------------------------------------------------------------------------
/// ----- Objectif : Ecrire une chaine dans un fichier de style INI
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------------------------------------------------------
/// ----- LPCTSTR lpAppName : section
/// ----- LPCTSTR lpKeyName : clé
/// ----- LPCTSTR lpString : valeur
/// -------------------------------------------------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sNomFichier
/// ----- Var Muettes (cf.partie préc) (3) : lpAppName ,lpKeyName ,lpString
/// ----- Var Internes à la fonction (1) : cle
/// ----- Var In (4) : lpAppName ,lpKeyName ,lpString ,m_sNomFichier
CString cle=lpAppName;
cle+=';';
cle+=lpKeyName;
// Inscription d'une nouvelle chaîne ou mise à jour si elle existe déjà
m_mapValeurs.SetAt(cle,lpString);
// Mise à jour du fichier
copyArbre(m_sNomFichier);
}
int BFichierIniPDA::getInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,int nDefault)const
{
/// -------------------------------------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::getInt(LPCTSTR lpAppName ,LPCTSTR lpKeyName ,int nDefault) -> int ----------------
/// -------------------------------------------------------------------------------------------------------------------
/// ----- Objectif : Lire un entier dans un fichier de style INI
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -------------------------------------------------------------------------------------------------------------------
/// ----- LPCTSTR lpAppName : Nom de la section
/// ----- LPCTSTR lpKeyName : Nom de la clé
/// ----- int nDefault(par défaut : '0') : Valeur par défaut
/// -------------------------------------------------------------------------------------------------------------------
/// ----- retour (int) : Valeur lue
/// -------------------------------------------------------------------------------------------------------------------
/// ----- Var Muettes (cf.partie préc) (3) : lpAppName ,lpKeyName ,nDefault
/// ----- Var Internes à la fonction (3) : cle ,l_iValeurRetour ,valeur
/// ----- Var In (3) : lpAppName ,lpKeyName ,nDefault
int l_iValeurRetour=nDefault;
CString cle=lpAppName;
cle+=';';
cle+=lpKeyName;
CString valeur;
if(m_mapValeurs.Lookup(cle,valeur))
// on a bien trouvé l'entrée
if(!valeur.IsEmpty())
l_iValeurRetour=_tcstol(valeur,NULL,0);
return(l_iValeurRetour);
}
void BFichierIniPDA::setInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,int nValeur)
{
/// -----------------------------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::setInt(LPCTSTR lpAppName ,LPCTSTR lpKeyName ,int nValeur) ----------------
/// -----------------------------------------------------------------------------------------------------------
/// ----- Objectif : Ecrire un entier dans un fichier de style INI
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// -----------------------------------------------------------------------------------------------------------
/// ----- LPCTSTR lpAppName : section
/// ----- LPCTSTR lpKeyName : clé
/// ----- int nValeur : Valeur à écrire
/// -----------------------------------------------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sNomFichier
/// ----- Var Muettes (cf.partie préc) (3) : lpAppName ,lpKeyName ,nValeur
/// ----- Var Internes à la fonction (2) : cle ,valeur
/// ----- Var In (4) : lpAppName ,lpKeyName ,m_sNomFichier ,nValeur
CString cle=lpAppName;
cle+=';';
cle+=lpKeyName;
CString valeur;
valeur.Format(_T("%d"),nValeur);
// Inscription d'une nouvelle valeur ou mise à jour si elle existe déjà
m_mapValeurs.SetAt(cle,valeur);
// Mise à jour du fichier
copyArbre(m_sNomFichier);
}
void BFichierIniPDA::delSection(CString p_sSectionSupprime)
{
/// ----------------------------------------------------------------------------------------
/// ---------------- BFichierIniPDA::delSection(CString p_sSectionSupprime) ----------------
/// ----------------------------------------------------------------------------------------
/// ----- Objectif : Supprimer une section entière
/// ----- Auteur(s) : Magic_Nono 17/01/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ----------------------------------------------------------------------------------------
/// ----- CString p_sSectionSupprime : Nom de la section à supprimer
/// ----------------------------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_sNomFichier
/// ----- Var Muettes (cf.partie préc) (1) : p_sSectionSupprime
/// ----- Var Internes à la fonction (4) : l_Position ,l_iIndex ,l_sSection ,l_sValeur
/// ----- Var In (1) : m_sNomFichier
POSITION l_Position;
int l_iIndex;
CString l_sSection;
CString l_sValeur;
l_Position=m_mapValeurs.GetStartPosition();
while(l_Position!=NULL)
{
m_mapValeurs.GetNextAssoc(l_Position,l_sSection,l_sValeur);
// Recherche de la position de la virgule qui sépare la section de la clé
l_iIndex=l_sSection.Find(_T(";"),0);
// Compare la section à supprimer et la section actuelle
if(p_sSectionSupprime.Compare(l_sSection.Left(l_iIndex))==0)
// supprime
m_mapValeurs.RemoveKey(l_sSection);
}
copyArbre(m_sNomFichier);
}
bool BFichierIniPDA::isVide()const
{
/// ------------------------------------------------------------------
/// ---------------- BFichierIniPDA::isVide() -> bool ----------------
/// ------------------------------------------------------------------
/// ----- Objectif : fichier vide?
/// ----- Auteur(s) : Magic_Nono 10/02/05
/// ----- PreCond : /
/// ----- PostCond : /
/// ----- Etat : 1 (-1<0<1<2)
/// ------------------------------------------------------------------
/// ----- retour (bool) : cf.objectif
/// ------------------------------------------------------------------
/// ----- Var Utilisées de la classe (1) : m_tailleArbre
/// ----- Var In (1) : m_tailleArbre
return(0==m_tailleArbre);
}
Magic Nono: l'informagicien!