ECRIRE/LIRE DANS UN FICHIER INI

Signaler
-
matmagik
Messages postés
2
Date d'inscription
mercredi 2 mars 2005
Statut
Membre
Dernière intervention
29 juillet 2006
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/9349-ecrire-lire-dans-un-fichier-ini

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

Oui je croi que cette fonction va m'aider dans mon programme.
Si vous pouviez me la passer pour voir comment ça fonctionne et l'intégrer dans mon programme
Merci pour votre aide et si j'ai des questions je vous contacterai.
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Je ne dirai rien de plus, Arnaud16022 a raison.
Si tu veux, j'ai déjà une fonction toute faite qui permet de fusionner deux fichiers.

YamNet
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
Bien sûr tu peux, par contre, va falloir le coder!
Ces deux fonctions ne servent QUE à lire et à écrire les fichiers .ini, certaintement pas à les interpréter. Donc c'est à toi de lire toutes les valeurs de l'ancien fichier, toutes les valeurs du nouveau, de choisir celles que tu veux garder et de réécrire le nouveau selon ces choix.
cs_Battout
Messages postés
5
Date d'inscription
lundi 23 avril 2007
Statut
Membre
Dernière intervention
14 août 2007

Salut,
Je travaille en ce moment avec les MFC en VS 2005 , et j'ai un petit programme à faire. En faite je vous s'explique le problème :
j'utilise un fichier de configuration "config.ini", lors de l'installation d'un patch, ce fichier sera écrasé par le fichier qui existe dans l'installe, ce qui n'est pas bien au cas ou l'utilisateur a des paramètres spéciaux.Il faut garder les paramètres de l'utilisteur et juste rajouter les nouveaux paramètres à l'ancien fichier.
Donc le but est de pouvoir mélanger deux fichiers config afin d'ajouter les nouveaux paramètres ( sections et clés) du nouveau fichier dans l'ancien.
Pour cela je vais crée une fonction AddConfigFile(CString sNewFilePath, CString sOldFilePath) qui prend en paramètre le fichier ancien de config et le nouveau fichier,
et je demande si les 2 fonctions GetPrivateProfileString et WritePrivateProfileString peuvent aboutir à des résultats encourageantes.
Est-ce que je peut comparer les sections de 2 fichiers .ini, et si elles sont différentes ou non?
Est ce que je peut faire des conditions pour modifier les paramètres d'un fichier config?
Je souhaite que je t'ennuie pas trop avec mes questions.
Je vous remercie et à la prochaine.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Mon raisonnement est le suivant,
Si je cherche 4 2+2=4 est plus simple que (88/2)-40=4.
En effet j'aime les chose simple pour deux raisons, la première est qu'il ne sert a rien de réinventé la roue, la second est que l'utilisateur ce fou royalement de comment c'est fait, il cherche avant tout la convivialité, la fiabilité et la rapidité tu met ça dans l'ordre que tu veut ça na pas d'importance.
Pour ce qui est de la paye, j'ai pour habitude de me payer, de plus si je devais embauché un programmeur ça ferais parti des qualité apprécié, la rapidité, la fiabilité, et la convivialité des programmes que je devrais mettre sur le marché, plutôt que de payer un gars des heures et des heures pour le même résulta voir moins bon, sans compté des mise a niveau super lourde etc.
En gros c'est le résulta qui compte.
Je suis d'accord c'est bien de chercher un peut plus loin que le bout de son nez cela permet souvent de faire encore plus simple et encore plus performant, cependant certaine chose évidente peuvent faire abstraction comme la roue tourne.
Etant donné que linux et mac OS ne m?intéresse pas du tout je préfère me concentrer sur un langage purement Microsoft c'est un choix.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Il me semble manquer un élément crucial dans ton raisonnement et le voila:
- à faire des choses simples on n'a droit qu'à une paie simple.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

on ce comprend,
en attendant je vien de faire exactement ce que je voulais en 2 lignes de codes en .NET avec un datagrid et un dataset et deux boutons.
ca me genere un XML et je peut le charger apres reouverture du prog exactement ce que je souhaitais.
le .net est visiblement bien plus simple enfin pour ce que je fait en tout cas.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
voilà c'est exactement ça
tu peux utiliser un language évolué, mais tu perdras en controle (possibilités) et en rapidité d'exécution
deux monde sur lesquels il est bon d'avoir une bonne vision.
Même si tu t'oriente vers le .NET, il est souvent utile de savoir ce qu'il se passe par en dessous.

apres, bon courage pour tes futurs devs.


Tu as eu une aperçu des Bxxx, elles ont été conçues dans ce but que je travaille toujours actuellement :
créer rapidement des choses fonctionnant avec les MFC,
puis, progressibement oter toutes les MFC afin d'attaquer directement en win32.
L'avantage est alors que les codes précédents ,maintenant, fonctionnent à l'identique ou presque avec win32, apres simplement une recompilation.
Une autre idée encore serai de faire ,pour tout ce qui est interface graphique ,une utilisation de librairie portable comme les GTK. Cela les rendraient également compilable pour Linux et éventuellement les Mac(a priori)
Comme tu vois, ce monde est immence et on apprend toujours.

Donc il est bon d'étudier d'abord les bases, apres, on peut suivre les différentes vagues, quelqu'elles soient.
selon les besoins et objectifs...
qu'ils soient personnels (optimisations, rapidités)
ou d'entreprise (rapidité de production, quitte à faire acheter des machines plus puissantes)

Bonnes évoltutions à tous
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Connaitre .net sera assurément un plus mais c'est un autre monde qui n'a plus rien à voir avec le code natif. Je pense qu'il vaut mieux bien maitriser le C/C++ natif avant d'aller faire quelque langage interprété que ce soit.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Lol ARNAUD16022 je vais être Geek jusqu'au bout, puisque apres l'analyse du code gentiment envoyer par Magic_NoNo, je me rend compte que j'était loin du compte, et me demande a présent si le code fournit dans ce tuto est vraiment pour visual c++ ou plus près du C tout cours, et m?ouvre les yeux sur peut être un problème que je n'envisageais pas.
C'est-à-dire soit du codes mélanger soit du vieux code ou les deux, j'ai la net impression que beaucoup de développeurs code sous linux et Windows et certains d'entre eux ne trouvent pas certaine fonction sous Windows crée leur propre fichier d'en tête pour créé leur fonction.
Résulta un néophyte comme moi ce retrouve complètement perdu.
Ce n'est nullement une critique que je fais, mais plutôt une analyse de ce que j'ai besoin, et pour le moment j'ai besoin d'explication claire et concise dans un langage défini et pour windows.
C'est pour quoi je vais m?orienter directement en .NET et abandonné mon système de sauvegarde d'adresse IP en *.ini par une mini base de donné en XML.
Je pense pas que ça soit plus simple mais ça m?évitera certainement de longue recherche sur les MFC qui semble de plus en plus abandonner comme le dit BruNews de plus persévérer dans le MFC risque de me donné une douleur supplémentaire dans quelque temps pour une migration .NET qui semble inévitable.
En tout cas merci a tous pour votre patience et votre aide j'ai énormément appris sans être productif certes mais quand même.
Merci encore.
Ps : désoler de t?avoir vexer avec mon troc de savoir c++ vs 3ds mais c'est la seul idée que j'ai pour le moment d'avoir des explications humaine avec des réponses humaine et pas simplement une théorie littéraire trop rigide a mon goût ou avec un manque de vulgarisation.
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
Welcome aboard ^^
geek powaa Tyron, tu verras la prog c'est géant :D
pour la console , Brunews, effectivement, c'est un peu exagéré; personnellement j'ai appris tout ce que je sais de POO par openGL interposé, c'est très motivant je trouve, et ca ne rend pas trop dépendant d'une API ... Magic_Nono me disait l'autre jour, en Java, on te change de lib et t'es perdu, c'est un peu le mêm principe ici je trouve.
Quoi qu'il en soit, bonne continuation.
Ah et encore un truc :
"je peut donné de l'aide ou des cours sur la modélisation" Ici c'est pas un marché, on sera tous heureux de pouvoir t'aider, si tu veux remercier la communauté, poste nous de bons progs ^^
bye
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Persévère et demande tant que tu veux, no prob et c'est même très bien. J'en ai vu arriver sur cppfrance des tout à fait noob de chez noob et 2 ans plus tard ils nous sortent des petits bijoux de prog alors en avant.
Les livres en english faut surtout pas hésiter à les lire, c'est généralement rdigé avec une telle pauvreté de vocabulaire que tu auras fait le tour de tous les mots employés en 3 pages maxi, c'est juste une habitude à prendre surtout qu'on ne traduit quasiment plus rien, les bons livres sont pratiquement tous en anglais.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

ARNAUD16022
Je comprends ce que tu veux dire, et je ne néglige en aucun cas la console que je travaille en parallèle.
Et c'est justement le but des exercices que je me donne, c'est-à-dire prendre ce que j'apprends en console pour l'appliquer sous différente pour windows.
J'ai un excellent ouvrage sur le C++ console qui m?apprend comme il faut, par contre pour Windows j'ai que le livre de Ivor Horton livrer avec visual C++ 6 et pour couronné le tout je comprend nada a l'anglais et ce genre d'apprentissage nécessite plus qu'une simple traduction systran.
MAGIC_NONO
Tu me rendrais un grand service car l'application que je me suis fixé est un peut plus complexe que cela, il est d'ailleurs certain que ton code me servira pas dans le programme, c'est uniquement pour analysé comment tu fait l'écriture du fichier INI et la sortie dans la listbox avec un bouton. Pour te prouver ma bonne fois l'ini devras accueillir des adresses IP d'un control IP_ADRESS ainsi que le port puis, récupérer ses adresse afin de faire des test de ping, puis sortir dans une autre fenêtre le résulta en, ping connecter et pas_ping pas connecter pour tester mes FTP.
Tu comprend donc que je te demande pas de me faire mon programme ce qui serais sur le coup pas me rendre service du tout.
BRUNEWS
Je suis bien évidemment d'accord avec toi, mais lorsque l'on débute la programmation c'est très dur d'avoir des bonnes infos en console, ça devient encore plus hard en MFC et en .NET c'est l'arlésienne.
J'ai un ami qui m?aide de temps en temps surtout quand il le peut et ça m?ennuis vraiment de le harceler avec ce genre de petit problème d'autant qu'il fait ça toute la journée.
Donc voila j'aime pas raconté ma vie, mais il faut, j'ai l'impression dans le milieu de la programmation ce justifier, car il semblerais qu'il y est des petit malin qui abuse et s'imagine que la programmation c'est facile pour vous qui avez la connaissance.
Ce n'est pas mon cas je cherche de l'aide pas un bénévole, je suis près un faire un échange de bon procéder d'ailleurs pour celui que ça intéresseras, maîtrisant 3d studio max, je peut donné de l'aide ou des cours sur la modélisation, le skinning et le mapping, ce qui peut être intéressant pour les programmeurs qui ce lance dans OpenGL ou directX.
Voila la tartine :D
J'espère ne pas être ennuyeux a lire
PS Arnaud je te donne mon adresse en MP merci de ton aide
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Il n'est peut-être pas obligé de retourner jusqu'à la console, les cin cout et std::string risquent de ne pas l'avancer beaucoup non plus.
Se mettre à MFC sans bonne doc et surtout en 2006, ce n'est pas l'avenir il me semble, il n'y a qu'à voir tous les wizzards MFC qui ont disparu sur les 2 dernières versions de VC++. Malgré que MFC est bien porté sur Win x64, essentiellement pour assurer la recompil x64 de l'existant, MS ne pousse plus du tout vers MFC depuis longtemps. Tous les exemples fournis sont maintenant en framework .net sinon directement sur API.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
oui; on peut le faire, mais ça ne te rendrai pas service de te le donner sur un plateau ici,
(surtt que ce n'est pas le lieu)
tu trouvera déjà quantité d'exemples au travers de ces pages,
à toi de les comprendre et de les adapter.
N'hésite pas à poser des questions précises, nous te répondrons avec plaisirs,
mais ne nous demande pas de code tout fait.
Ciao
Nono

Nota : si tu y tiens absoluement, je peux te passer un code écrit en 5 mn qui fera ce que tu veux, mais par contre, il utilisera MFC & les Bxxx... choses que visiblement tu ne maitrises pas encore,
passe un MP en indiquant ton mail pour cela.
mais commence plutot a te documenter avec des ouvrages comme le petzold
(tu trouveras les liens au travers de ces pages)
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
bah si t'es un méga noob, comme tu dis, selon moi, autant retourner en mode console c'est pas le MFC qui t'apprendra le C++.
enfin
avis personnel bien sûr.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Non je sais pas faire, je suis le mega noob j'essai d'apprendre en créant des petit exercice et en trouvant les solutions mais c'est pas le cas.
Peut tu par simplicité créé un projet MFC dialogue avec juste un control boutton et une ListeBox et mettre les sources en téléchargement steup?
Le bouton crée l'INI et l'affiche dans la listebox je verrais mieux comme ça pasque la je rajoute du code dans tout les sens et je n'arrive a rien.
Merci d'avance.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
met donc ce code dans le OnInitDialog, tant qu'à faire, ça permettra d'initialiser ta liste au démarrage de ton code.

nota : éventuellement faire suivre les lignes citées de "UpdateData(false);"
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
bref passons sur cette modif du code,


je pense que tu sais avec visual comment créer une variable associée à ta listBox

dc dans ton header, tu as qqch comme ça
CListBox m_maListe;


et donc sur ton bouton:

// Add 10 items to the list box.
CString str;
for (int i=0;i < 10;i++)
{
str.Format(_T("item string %d"), i);
m_maListe.AddString( str );
}

apres , a toi de réintégrer les chaines de ton fichier ini.
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

D'accord je vois ce que tu veut dire, mais je ne sais pas faire, c'est pas bien grave je vais chercher un projet MFC sur le site qui utilise un *.ini et analysé comment le programmeur utilise ces fonctions.
En tout cas merci de ta patience et de ton aide, si c'est pas facile pour un débutant c'est bien lourd ceux qui le sont pas.
Merci beaucoup.
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Salut,

Tu as placé ton code lorsque de l'évènement de changement de sélection de ta listbox change.
Donc si tu n'a rien dans ta listbox, c'est normal que ton code ne soit pas executé, car si la listbox est vide, tu ne peux pas changer la sélection.
Fait plutot un autre bouton qui va charger ta listbox à partir de ton fichier .INI

LallThis
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

J'avais vu cette erreur, d'ailleurs ça compile pas sens, du faite que ça ne soit pas déclaré, mais quand je dit que ça ne marche pas, c'est que c'est pareil rien ne s'affiche, j'ai aucune erreur de compilation comme pour la formule qui est plus simple, et j'ai le même résulta.
Es que ça marche chez vous ? En faisant un projet MFC type dialogue avec un bouton pour l'enregistrement du INI et un control list box pour la lecture ?
Ce message m?interpelle quand même « ceci dit, dans ce code, tu n'utilises pas ta CListBox, donc, c'est normal qu'il n'y ai "pas d'effet visible" »
Veut tu dire que placer le code dans le contrôle ça ne suffit pas ?
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
arf, j'ai oublié un '_'
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Alors merci MagicNono pour ton code scientifique qui ne marche pas ;o), mais l'idée est de prendre le code fournit dans ce poste et de le faire fonctionné avec ça simplicité.
LallThis j'ai mis un point d'arrêt sur la fonction GetPrivateProfileString et le point descend sur ".\\Test.ini" ); en me disant (aucune condition) Nombres d'accès toujours arrêter.
J'utilise visual studio net 2003.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
LallThis> "projet mfc ", il a dit => VC.
avec son code légerement modifié comme je l'ai spécifié plus haut, on va etre vite fixé.
sans meme qu'il soit question de mode débug
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Je voulais savoir, si tu passe to programme en mode debug (F5) et que tu possitionnes un point d'arret (breakpoint) sur la fonction GetPrivateProfileString et que tu appuie sur F10 (pour passer à l'instruction suivante), quelles sont les données stockés dans ta variable "temp" ?

Question qui n'a rien à voir, tu utilise quoi pour développer ?

LallThis
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
ceci dit, pour des raisons de portabilité (sur os polonnais, japonnais ou autre),
je déconseille l'usage d'accent dans les clefs & valeur de section des .ini
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
void CtestiniDlg::OnLbnSelchangeList1()
{
#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endif /* !_countof */

char temp[100];
GetPrivateProfileString(
"OPTION",
"Clé",
"",
temp,
countof(temp),
"Test.ini" );
AfxMessageBox(temp);//optionnellement, pour test
}


ceci dit, dans ce code, tu n'utilises pas ta CListBox, donc, c'est normal qu'il n'y ai "pas d'effet visible"
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Pardonne moi je suis novice, enfin pas besoin de précisé je pense, je ne comprend donc pas ta première question.
Pour la second je rajout simplement le code entre les accolades comme ceci.

void CtestiniDlg::OnLbnSelchangeList1()

{
char temp[100];
GetPrivateProfileString(
"OPTION",
"Clé",
"",
temp,
sizeof(temp),
"Test.ini" );
}
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Quand tu passes en debug, après l'appel de GetPrivateProfileString, y'a quoi dans temp ????

Comment tu ajoutes à ta listbox ???

LallThis
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Ah oui bien sur le Test.ini est bien remplie voici ce qu'il contient,
[OPTION]
Clé=Ajout
Je me demande si le contrôle listbox est le bon contrôle en faite
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Ca ne marche pas non plus, c'est la déroute !!
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Je ne vois pas pourquoi ça ne fonctionnerai pas !!!!
Tu es sur que dans le fichier Test.ini, il y a bien une section nommé "OPTION", avec une clé nommé "Clé" et qu'il y a des données dedans.
Car typiquement, si GetPrivateProfileString retourne la valeur spécifié par défaut, c'est que qu'il y a un paramètre qui n'existe pas.

LallThis
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
a mon avis, le pb est plutot dans ta façon d'afficher ta listeBox : voir les UpdateData & autres sources de pb...
au pire, vérifie en débug si les variables sont bonnes...
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
oups, pas standard,
voici countof défini par le projet...

#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endif /* !_countof */
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

Je viens de faire les testes et ça ne fonctionne pas je suis vraiment a la rue, je comprend pas pourquoi, ça a l'air tellement simple.
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
utiliser _countof au lieu de sizeof

++
Nono
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Tu as essayer de mettre comme chemin seulement "Test.ini" et non ".\\Test.ini" ?
Essai aussi de ne pas mettre sizeof(temp) mais 100.

LallThis
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

En faite j ai créé un projet mfc spécialement pour ça
Avec un bouton avec le même code que l'exemple soit :
1. WritePrivateProfileString(
2. "OPTION",
3. "Clé",
4. "Ajout", // chaine de caractere à ajouter
5. ".\\Test.ini" );
Et une listebox avec ce code :

1. char temp[100];
2. GetPrivateProfileString(
3. "OPTION",
4. "Clé",
5. "",
6. temp,
7. sizeof(temp),
8. ".\\Test.ini" );
Mais rien ne s'affiche dans la liste pourtant le Test.ini est bien créé
Merci pour ton aide
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Salut,
Un projet en MFC ne pose aucun problème.
Donne moi l'appel de GetPrivateProfileString().
Si la fonction retour un code erreur, donne le moi aussi.

Lallthis
Tyron3
Messages postés
20
Date d'inscription
samedi 7 juin 2003
Statut
Membre
Dernière intervention
8 décembre 2006

J'ai un gros souci avec GetPrivateProfileString() impossible de lire mon ini, c'est pour un projet en mfc cela viendrait-il de la ?
J'ai un doute puisque l'écriture ce fait parfaitement.
Merci de votre aide.
cs_sena
Messages postés
126
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
15 février 2005

en effet, la fonction d'ajout permet également de modifier l'existant.
minet03
Messages postés
415
Date d'inscription
samedi 4 janvier 2003
Statut
Membre
Dernière intervention
2 décembre 2005
1
Est ce que la fonction d'ajout modifie aussi ?
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
juste pour terminer cette micro discussion:

cast to char* puis atof
= transtyper ton LPWSTR en char*
ce nouvel element est utilisable avec l'operateur
atof
qui converti une chaine en nb floatant

Bon WE
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
ouaou je comprends plus rien.
alors, oui, je cale rien veut dire je ne comprends rien...
pour car = caractère(s) j'avais compris
pour cast to char* puis atof je "cale" rien...mais encore une fois je vais chercher t de toute facon je n'en ai plus besoin...
et pis on va arreter de polluer la source de Lallthis et de spammer tout le monde...

ciao

ad
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
cale= comprendre??

en tt cas : car = caractère(s)

++

pleaz be more specific
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
???
cale rien, vais faire qqes recherches ;)
de toute facon c'est pas bien grave, j'ai refait la fonction entre temps :)
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
LPWSTR est une chaine de car,
=> à convertir de maniere classique

cast to char* puis atof

++
Nono.
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
Ouuups la j'ai dit une betise...
changeons dons la question:
y a-t-il moyen de convertir une LPWSTR en float?
bon forcément, ya moyen en scannant tous les caractères de la source, mais un truc simple ya pas?

merci
Arnaud16022
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
comment on fait si la valeur a lire n'est pas une string mais un nombre? la meme chose?

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

marche?
ca ne risque pas de planter de temps en temps?

merci

ad
magic_Nono
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Salut!!

G publié il y a qq tps ma classe d'utilisation de fichiers ini...

elle permet la gestion de DONNEES, LISTES & COMBOBOXS
sauvee ds des ini...
http://www.cppfrance.com/code.aspx?ID=18784
douxlapinblanc
Messages postés
4
Date d'inscription
mardi 21 octobre 2003
Statut
Membre
Dernière intervention
29 décembre 2004

Oui tres claire merci

La lib est "Windows.h"
camjelemon
Messages postés
11
Date d'inscription
mardi 26 février 2002
Statut
Membre
Dernière intervention
14 janvier 2005

Good Game :D
Je voudrais savoir si y a un moyen de voir si une SECTION existe =).
Merci
RaphAstronome
Messages postés
105
Date d'inscription
samedi 7 décembre 2002
Statut
Membre
Dernière intervention
17 août 2009

Bravo, voila un code vraiment utile et clair !
Une seule remparque il faudrait que tu présise ci quels fichiers includes sont requis.
garslouche
Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

Merci, ce code est très clair.

Est-ce qu'il y a une API qui permet d'ajouter des commentaires (lignes commençant par un point-virgule) ?

Merci
cs_sena
Messages postés
126
Date d'inscription
jeudi 9 janvier 2003
Statut
Membre
Dernière intervention
15 février 2005

ce petit code est vraiment nickel !
on comprend très vite car on voit comment c'est construit et comment il faut l'utiliser.
C'est beucoup plus simple ke si ca avait été inclu dans une appli, car après il faut aussi comprendre comment fonctionne l'aplli ....
j'ai mis moins de temps à comprendre que Windows ne met a planter (c'est vous dire si ce code est simple et efficace...)
Merci encore.
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Y'a deja des exemples de l'utilisation...
pas besoin de fair une appli.

Bye
Lallthis
cs_zzzzzz
Messages postés
408
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
18 décembre 2012

c pas mal a part que t'aurai du faire une applic console qui illustre tout ca
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Je pense que non, car ces deux fonctions sont des API.
Tu peux refaires tes fonctions, mais c'ets plus rapide avec les API.

Bye
LallThis
D1m3x
Messages postés
402
Date d'inscription
samedi 28 décembre 2002
Statut
Membre
Dernière intervention
21 juillet 2005
1
Est-ce que ce n'est pas possible avec Fread et fwrite?
cs_Belial
Messages postés
13
Date d'inscription
mercredi 5 juin 2002
Statut
Membre
Dernière intervention
23 février 2004

Une petite astuce pour supprimer une section :

WritePrivateProfileString(Nom_Section, Nom_Key, NULL, Nom_Fichier);
LallThis
Messages postés
13
Date d'inscription
lundi 16 avril 2001
Statut
Membre
Dernière intervention
9 août 2007

Je ne me souvient plus vraiment, mais il me semble que c dans windows.h ou window.h

Bye Lallthis
YoDaaa
Messages postés
21
Date d'inscription
mercredi 23 janvier 2002
Statut
Membre
Dernière intervention
22 juin 2002

GetPrivateProfileString/et write... se trouvent dans quelle librairie??
Désolé, VC++ 6
LE COMPILATEUR DANS LE TITRE DE LA SOURCE !!!!