Ecrire/lire dans un fichier ini

0/5 (71 avis)

Snippet vu 47 219 fois - Téléchargée 40 fois

Contenu du snippet

Code sous Visual C++ 6

Deux fonctions vont etre utlisé :
GetPrivateProfileString
WritePrivateProfileString

C'est pour faire des fichiers avec comme extension .ini
Ils seront ecris de la forme :

[SECTION]
key = chaine
key2 = chaine2

Source / Exemple :


//==============================================================
//Pour Lire :

GetPrivateProfileString(
  Nom_Section,
  Nom_Key,
  Default,        // string par default
  Destination,
  Taille_destination,
  Nom_Fichier        // nom du fichier
);

// Exemple :

// Pour Lire a partir d'un fichier "Test.ini" et
// stocker dans char temp[100] qui est une chaine de caractere

GetPrivateProfileString(
"OPTION",
"Clé",
"",
temp,
sizeof(temp),
"Test.ini" );

//==============================================================
//Pour Ecrire:

WritePrivateProfileString(
  Nom_Section,
  Nom_Key,
  Chaine_de_caractere,
  Nom_Fichier        // nom du fichier
);

// Exemple :

// Pour Ecrire dans un fichier "Test.ini"

WritePrivateProfileString(
"OPTION",
"Clé",
"Ajout",     // chaine de caractere à ajouter
"Test.ini" );

Conclusion :


Ces deux fonctions sont très pratique pour utiliser des fichiers de configuration d'application.

A voir également

Ajouter un commentaire Commentaires
matmagik Messages postés 3 Date d'inscription mercredi 2 mars 2005 Statut Membre Dernière intervention 23 octobre 2022
14 juil. 2013 à 13:08
simple et efficace ! merci :-)
(peut-être juste rajouter dans le message initial le include windows.h)
cs_Battout Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 14 août 2007
14 août 2007 à 11:12
c'est bon pour le code ca marche bien, je récupère tous mes sections avec les clés.
Il me reste que faire les conditions sur l'ancien fichier.
Je vous remercie pour votre aide.
A la prochaine
cs_Battout Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 14 août 2007
10 août 2007 à 15:06
Salut, j'ai eu ds pbs au niveau de la récupération des clés de chaque section.J'ai pas pu boucler sur chaque section,en faite ma fonction que j'ai fait est:
void CConfig::AddConfigFile(CString sNewFilePath, CString sOldFilePath)
{
//Test
sOldFilePath = TEXT("C:\\affconfig-default.ini");
sNewFilePath = TEXT("C:\\affconfig.ini");
TCHAR szKeysName[1024];
TCHAR inBuf1[1024];
TCHAR szSectionOld[1024];
TCHAR szSectionNew[1024];
TCHAR szSectionNameOld[1024];
TCHAR szSectionNameNew[1024];
TCHAR szTemp[1024];
DWORD nSizeRetNew = 0, nSizeRetOld=0,nSectionsSize=0, dwSectionsSize = 0, dwKeysSize = 0;

//calculer la taille de Buffer
nSizeRetNew = GetPrivateProfileSectionNames( szSectionNameNew,
sizeof( szSectionNameNew), // size of return buffer
sNewFilePath);
// calculer le nombre de section
if(nSizeRetNew > 0)
{
dwSectionsSize = nSizeRetNew + 2;
int nSection=0,npos=0;
while ( npos < nSizeRetNew)
{

npos = npos + (_tcslen(szSectionNameNew + npos)+1);
for (int i=0; (unsigned int)i< dwSectionsSize; i++)
{
_tcsncpy(szSectionNew, szSectionNameNew,_tcslen(szSectionNameNew + 1));// je ne suis pa sur de ca en tous cas ça marche pas
nSectionsSize = GetPrivateProfileSection(szSectionNew,szKeysName,1024,sNewFilePath); //retourne les clés
}

//boucle sur les clés
//for (int i = 0; (unsigned int)i < sizeof(szKeysName); i++)
//{


//}


nSection++;
}
}
}
Je récupère tous mes sections et après j'ai pas réussi à boucler sur ces sections pour récupérer les clés.
Je suis bloqué sur cette partie,Est ce Que quelqu'un a une petite idée?
A+
cs_Battout Messages postés 5 Date d'inscription lundi 23 avril 2007 Statut Membre Dernière intervention 14 août 2007
9 août 2007 à 16:29
Salut,
Dans ta fonction, est-ce que je peut utiliser des tableaux de TCHAR au lieu de char *?
en faite si j'utilise le char [dwRet = GetPrivateProfileSectionNames(szTemp, 1024, SourceFile);] me retourne une valeur 0 au moment de bulding et j'ai pas trouvé une solution pour l'intégrer avec mon prg.
j'ai essayé de travailler avec des tableaux comme TCHAR sztemp[1024]; à la place de char *szTemp, mais ça ma causer bcq de problème.
A+
LallThis Messages postés 13 Date d'inscription lundi 16 avril 2001 Statut Membre Dernière intervention 9 août 2007
9 août 2007 à 10:01
Voila la fonction :

// ALLOCATION / DESALLOCATION
inline void MYMALLOC(void** a, int b)
{
*a=NULL;
if ( b > 0)
{
*a = malloc(b) ;
if (*a != NULL)
memset(*a, '\0', b) ;
}
}
#define MYFREE(a) { if(a !NULL) free((void*)a) ; a NULL ;}

void MergeFile(char *SourceFile, char *TargetFile)
{
char *szSections NULL, *szSectionName NULL;
char *szKeys NULL, *szKeyName NULL, *szKeyValue = NULL;
char *szTargetKeyValue = NULL;
char *szTemp = NULL;
DWORD dwRet 0, dwSectionsSize 0, dwKeysSize = 0;
DWORD dwTargetKeySize = 0;

if (SourceFile && TargetFile)
{
MYMALLOC((void**)&szTemp, 1024);

// Calcul the size of buffer
dwRet = GetPrivateProfileSectionNames(szTemp, 1024, SourceFile);
if (dwRet > 0)
{
dwSectionsSize = dwRet + 2;
while(dwRet == (1024-2))
{
MYFREE(szTemp);
MYMALLOC((void**)&szTemp, dwRet*2);
dwRet = GetPrivateProfileSectionNames(szTemp, dwRet*2, SourceFile);
dwSectionsSize = dwRet + 2;
}

MYFREE(szTemp);

// Fill the buffer
MYMALLOC((void**)&szSections, dwSectionsSize + 1);
dwRet = GetPrivateProfileSectionNames(szSections, dwSectionsSize, SourceFile);

// Loop for each Section
for (int i=0; (unsigned int)i<dwSectionsSize; i++)
{
MYMALLOC((void**)&szSectionName, strlen(szSections + i) + 1);

// Retrieve section name
strncpy(szSectionName, szSections + i, strlen(szSections + i));

MYMALLOC((void**)&szTemp, 1024);
// Calcul the size of buffer
dwRet = GetPrivateProfileSection(szSectionName, szTemp, 1024, SourceFile);
if (dwRet > 0)
{
dwKeysSize = dwRet + 2;
while(dwRet == (1024-2))
{
MYFREE(szTemp);
MYMALLOC((void**)&szTemp, dwRet*2);
dwRet = GetPrivateProfileSection(szSectionName, szTemp, dwRet*2, SourceFile);
dwKeysSize = dwRet + 2;
}
MYFREE(szTemp);

// Fill the buffer
MYMALLOC((void**)&szKeys, dwKeysSize + 1);
dwRet = GetPrivateProfileSection(szSectionName, szKeys, dwKeysSize, SourceFile);

// Loop for each Key
for (int j=0; (unsigned int)j<dwKeysSize; j++)
{
MYMALLOC((void**)&szKeyName, strlen(szKeys + j) + 1);

// Retrieve key name
strncpy(szKeyName, szKeys + j, strlen(szKeys + j));

// If the first char is not ;, this is not a comment
if (szKeyName[0] != ';')
{
// If = is not found, skip key
if (strstr(szKeyName, "=") != NULL)
{
// Initiliaze key value
szKeyValue = strdup( strstr(szKeyName, "=") + 1 );

strstr(szKeyName, "=")[0] = '\0';

if (strlen(szKeyValue) > 0)
{
// Check if this key is in the target file

MYMALLOC((void**)&szTargetKeyValue, 1024);

// Calcul the size of buffer
dwRet = GetPrivateProfileString(szSectionName, szKeyName, "", szTargetKeyValue, 1024, TargetFile);
if (dwRet > 0)
{
dwTargetKeySize = dwRet + 2;
while(dwRet == (1024-2))
{
MYFREE(szTargetKeyValue);
MYMALLOC((void**)&szTargetKeyValue, dwRet*2);
dwRet = GetPrivateProfileString(szSectionName, szKeyName, "", szTargetKeyValue, dwRet*2, TargetFile);
dwTargetKeySize = dwRet + 2;
}

if (dwTargetKeySize != 0)
{
MYFREE(szTargetKeyValue);
MYMALLOC((void**)&szTargetKeyValue, dwTargetKeySize + 1);

dwRet = GetPrivateProfileString(szSectionName, szKeyName, "", szTargetKeyValue, dwTargetKeySize, TargetFile);
if (strlen(szTargetKeyValue) > 0)
{
if(stricmp(szTargetKeyValue, szKeyValue) != 0)
{
// Update the key
BOOL bWritted = WritePrivateProfileString(szSectionName, szKeyName, szKeyValue, TargetFile);
OutputDebugString("toto");
}
}
else
{
// Update the key
WritePrivateProfileString(szSectionName, szKeyName, szKeyValue, TargetFile);
}

MYFREE(szTargetKeyValue);
}
else
{
// Update the key
WritePrivateProfileString(szSectionName, szKeyName, szKeyValue, TargetFile);
}
}
else
{
// Update the key
WritePrivateProfileString(szSectionName, szKeyName, szKeyValue, TargetFile);
}
}

// Add szTemp length to i
j += strlen(szKeyName) + strlen(szKeyValue) + 1/*=*/;
}
else
j += strlen(szKeyName);
}
else
j += strlen(szKeyName);

MYFREE(szKeyValue);
MYFREE(szKeyName);
}
}

// Add szTemp length to i
i += strlen(szSectionName);

MYFREE(szKeys);
MYFREE(szSectionName);
}
}
}

MYFREE(szKeyName);
MYFREE(szKeys);
MYFREE(szSectionName);
MYFREE(szSections);
}

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.