Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Classe d'application (CWinApp) > Les Fichiers .ini
        Comment faire pour écrire et lire dans un fichier .ini ?
        Comment stocker une zone binaire dans un .ini ?
        Comment lire/écrire un entier dans un .ini ?
        Comment faire pour changer le nom du .ini dans une application MFC ?
        Comment utiliser les autres fonctions dédiées aux fichiers .ini dans une application MFC ?
        Comment compter le nombre de sections d'un fichier ini ?
        Comme travailler avec un fichier INI avec eMbedded visual C++?
        Comment supprimer une clef ou une section dans un fichier .ini ?



Comment faire pour écrire et lire dans un fichier .ini ?
auteur : Farscape
Les MFC fournissent les fonctions de base pour gérer les .ini
Elles permettent l'écriture/lecture d'entiers, de chaînes de caractères, de zones binaires.
Elles sont contenues dans la classe CWinApp :

CWinApp::GetProfileInt 
UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );
CWinApp::WriteProfileInt 
BOOL WriteProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue );

CWinApp::GetProfileString 
CString GetProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault = NULL );

CWinApp::WriteProfileString 
BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue );

CWinApp::WriteProfileBinary
BOOL WriteProfileBinary(  LPCTSTR lpszSection,   LPCTSTR lpszEntry,   LPBYTE pData,
   UINT nBytes );

CWinApp::GetProfileBinary
BOOL GetProfileBinary(LPCTSTR lpszSection,LPCTSTR lpszEntry,LPBYTE* ppData,  UINT* pBytes );
Le .ini résultant est stocké dans le répertoire Windows et porte le nom de l'application.
Les fonctions de lecture admettent un argument pour spécifier une valeur par défaut quand la clef n'existe pas dans le .ini.


Comment stocker une zone binaire dans un .ini ?
auteur : Farscape
Avec la fonction :

CWinApp::WriteProfileBinary
BOOL WriteProfileBinary(  LPCTSTR lpszSection,   LPCTSTR lpszEntry,   LPBYTE pData,
   UINT nBytes );
Les usages sont divers, par exemple stocker les dimensions d'une fenêtre ou sa position, la valeur d'un colorref etc?
Exemple :

CRect RectInitial;
AfxGetApp()->WriteProfileBinary("MainBar","SizeAndPos",
                (BYTE*)(LPRECT)RectInitial,sizeof(RECT));
COLORREF cGroupBkColor;
AfxGetApp()->WriteProfileBinary("Colors","bkg",(BYTE *)&cGroupBkColor,sizeof(COLORREF));

// la lecture
BYTE* pb = NULL;
UINT nLen = 0;
if(AfxGetApp()->GetProfileBinary("MainBar","SizeAndPos",&pb,&nLen))
{

    ASSERT(nLen == sizeof(RECT));
    memcpy(&RectInitial, pb, sizeof(RECT));
    delete pb;
}

Comment lire/écrire un entier dans un .ini ?
auteur : Farscape
Si l'entier ne doit pas être stocké sous forme ASCII on utilisera

CWinApp::GetProfileInt
 
UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );
Exemple d'écriture.

int iAge=20 ;
AfxGetApp()->WriteProfileInt("Clef ", "Age", iAge);
// sous Forme ASCII
CString str;
str.Format("%d?,iAge);
AfxGetApp()->WriteProfileString("Clef ", "Age", str);
Exemple de lecture

int iAge = AfxGetApp()->GetProfileInt("Clef ", "Age", 0);
// sous Forme ASCII
int iAge =atoi(AfxGetApp()->GetProfileString(?Cleg?,?Age?,?0?));

Comment faire pour changer le nom du .ini dans une application MFC ?
auteur : Farscape
Par défaut le .ini prend le nom du programme.

On accède au nom interne par la variable :

CWinApp::m_pszProfileName
si on veut changer le nom il faudra procéder comme suit:

//
// En premier libérer la mémoire allouée à la variable, cette
// Allocation est faite avant InitInstance
free((void*)m_pszProfileName);
//changer le nom du .ini
//le destructeur de CWinApp se chargera de libérer la mémoire 
m_pszProfileName =_tcsdup(_T("c:\\quelquepart\\ myini.ini"));

Comment utiliser les autres fonctions dédiées aux fichiers .ini dans une application MFC ?
auteur : Farscape
La classe CWinApp ne reprend pas toutes les apis de traitement sur les fichiers ini ,comme cette fonction:

GetPrivateProfileString 
DWORD GetPrivateProfileString(
  LPCTSTR lpAppName,        // section name
  LPCTSTR lpKeyName,        // key name
  LPCTSTR lpDefault,        // default string
  LPTSTR lpReturnedString,  // destination buffer
  DWORD nSize,              // size of destination buffer
  LPCTSTR lpFileName        // initialization file name
);
 
Comment faire alors dans une application MFC pour fournir le nom (lpFileName)?
Tout simplement en utilisant la donnée membre de la classe d'application:

CWinApp::m_pszProfileName

char buffer[4096];
GetPrivateProfileString(NULL, NULL, NULL,
            buffer, sizeof(buffer),AfxGetApp()->m_pszProfileName);

Comment compter le nombre de sections d'un fichier ini ?
Créé le 04/04/2005[haut]
auteur : Farscape
en utilisant la fonction:

DWORD GetPrivateProfileSectionNames(
  LPTSTR lpszReturnBuffer,  // return buffer
  DWORD nSize,              // size of return buffer
  LPCTSTR lpFileName        // initialization file name
);
cette fonction retourne le nom des sections dans la chaîne lpszReturnBuffer,et chaque section est séparée par un '\0' :

char *szReturnedString= new char[32000];
int nSizeRet= GetPrivateProfileSectionNames( szReturnedString,
                                   32000,              // size of return buffer
                                   "c:\\windows\\myininame.ini");

    int nSection=0,npos=0;
    while(npos<nSizeRet)
    {
        npos+=(strlen(szReturnedString+npos)+1);
        nSection++;
    }
delete szReturnedString;

Comme travailler avec un fichier INI avec eMbedded visual C++?
Créé le 27/11/2005[haut]
auteur : Farscape
eMbedded visual C++ ne supporte pas les fonctions d'accès aux fichiers INI, il faudra utiliser une classe simulant le fonctionnement des fichier INI.

La classe qui est proposée provient du site codeguru.
Je l'ai modifiée pour :
Corriger les bugs de libération mémoire .
Modifier les fonctions de lectures et écritures des données pour la compatibilité avec EVC .
Rajouter les fonctions de bases de manipulation des fichiers INI tel que le propose les MFC .avec la classe CWinApp.

Liste des fonctions rajoutées :

 CString GetProfileString(const char *szSection,const char *szKey,const char *szDefault="");

bool WriteProfileString(const char *szSection,const char *szKey,const char *szValue);

int GetProfileInt(const char *szSection,const char *szKey,int nDefault=0);

bool WriteProfileInt(const char *szSection,const char *szKey,int nValue);

bool GetProfileBinary(const char * szSection,const char * szEntry,BYTE** ppData,UINT* pBytes);

// GetBinary: Load a Binary value.
bool GetBinary(t_Str szSection,t_Str szEntry,BYTE** ppData,UINT* pBytes);

// ecriture de données binaires comme avec les MFC
bool WriteProfileBinary(const char * szSection,const char * szEntry,LPBYTE pData,UINT nBytes);

// SetBinary: Set a binary value
bool SetBinary(t_Str szSection,t_Str szEntry,LPBYTE pData,UINT nBytes);

// detruire la clef szKey pour la section szFromSection
bool DeleteKey(const char * szKey, const char *szFromSection = "");

// detruire la section szSection
bool DeleteSection(const char *szSection);

// renvoie true si la section szSection existe
bool FindSection(const char *szSection);

// renvoie true si la clef szKey pour la section szSection existe
bool FindKey(const char *szKey,const char *szSection);

// indique si le fichier est lu
bool IsLoad(){return m_bLoaded;}


Comment supprimer une clef ou une section dans un fichier .ini ?
Créé le 22/01/2007[haut]
auteur : Farscape

CWinApp::WriteProfileString 
BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszValue );

si lpszValue = NULL la clef représentée par lpszEntry est détruite.
si lpszEntry = NULL et lpszValue = NULL la section lpszSection est détruite

voir MSDN WritePrivateProfileString pour référence.




Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web