Ecrire/lire dans un fichier ini

Soyez le premier à donner votre avis sur cette source.

Snippet vu 46 012 fois - Téléchargée 38 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

Messages postés
2
Date d'inscription
mercredi 2 mars 2005
Statut
Membre
Dernière intervention
29 juillet 2006

simple et efficace ! merci :-)
(peut-être juste rajouter dans le message initial le include windows.h)
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
14 août 2007

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
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
14 août 2007

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+
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
14 août 2007

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+
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

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);
}
Afficher les 71 commentaires

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.