Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ECRIRE/LIRE DANS UN FICHIER INI


Information sur la source

Catégorie :Fichiers / Disque Classé sous : lire, ecrire, fichier, ini Niveau : Débutant Date de création : 29/11/2001 Date de mise à jour : 30/11/2001 00:00:00 Vu : 34 269

Note :
8,3 / 10 - par 10 personnes
8,30 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (68)
Ajouter un commentaire et/ou une note

Description

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

  • //==============================================================
  • //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" );

//==============================================================
//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.
 

Commentaires et avis

signaler à un administrateur
Commentaire de YoDaaa le 18/08/2002 14:51:16

GetPrivateProfileString/et write... se trouvent dans quelle librairie??

signaler à un administrateur
Commentaire de LallThis le 19/08/2002 09:24:13

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

Bye Lallthis

signaler à un administrateur
Commentaire de Belial le 27/08/2002 21:36:07

Une petite astuce pour supprimer une section :

WritePrivateProfileString(Nom_Section, Nom_Key, NULL, Nom_Fichier);

signaler à un administrateur
Commentaire de D1m3x le 04/03/2003 13:58:06

Est-ce que ce n'est pas possible avec Fread et fwrite?

signaler à un administrateur
Commentaire de LallThis le 04/03/2003 14:19:14

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

signaler à un administrateur
Commentaire de zzzzzz le 08/03/2003 15:01:35

c pas mal a part que t'aurai du faire une applic console qui illustre tout ca

signaler à un administrateur
Commentaire de LallThis le 10/03/2003 09:23:55

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

Bye
Lallthis

signaler à un administrateur
Commentaire de sena le 30/04/2003 16:56:26

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.

signaler à un administrateur
Commentaire de garslouche le 26/05/2003 08:46:22

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

signaler à un administrateur
Commentaire de RaphAstronome le 11/10/2003 13:18:19

Bravo, voila un code vraiment utile et clair !
Une seule remparque il faudrait que tu présise ci quels fichiers includes sont requis.

signaler à un administrateur
Commentaire de camjelemon le 26/11/2003 08:56:48

Good Game :D
Je voudrais savoir si y a un moyen de voir si une SECTION existe =).
Merci

signaler à un administrateur
Commentaire de douxlapinblanc le 28/11/2003 10:15:16

Oui tres claire merci

La lib est "Windows.h"

signaler à un administrateur
Commentaire de magic_Nono le 15/01/2004 10:51:01

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

signaler à un administrateur
Commentaire de Arnaud16022 le 07/10/2004 22:19:58

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

signaler à un administrateur
Commentaire de Arnaud16022 le 08/10/2004 17:03:31

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

signaler à un administrateur
Commentaire de magic_Nono le 08/10/2004 18:43:41

LPWSTR est une chaine de car,
=> à convertir de maniere classique

cast to char* puis atof

++
Nono.

signaler à un administrateur
Commentaire de Arnaud16022 le 08/10/2004 19:04:37

???
cale rien, vais faire qqes recherches ;)
de toute facon c'est pas bien grave, j'ai refait la fonction entre temps :)

signaler à un administrateur
Commentaire de magic_Nono le 08/10/2004 20:14:40

cale= comprendre??

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

++

pleaz be more specific

signaler à un administrateur
Commentaire de Arnaud16022 le 08/10/2004 20:25:28

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

signaler à un administrateur
Commentaire de magic_Nono le 08/10/2004 20:29:05

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

signaler à un administrateur
Commentaire de minet03 le 11/02/2005 16:46:58

Est ce que la fonction d'ajout modifie aussi ?

signaler à un administrateur
Commentaire de sena le 11/02/2005 16:52:21

en effet, la fonction d'ajout permet également de modifier l'existant.

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 10:38:52

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.

signaler à un administrateur
Commentaire de LallThis le 15/02/2006 10:54:27

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

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 11:45:48

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

signaler à un administrateur
Commentaire de LallThis le 15/02/2006 11:54:04

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

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 14:26:28

utiliser _countof au lieu de sizeof

++
Nono

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 14:26:31

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.

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 14:29:57

oups, pas standard,
voici countof défini par le projet...

#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endif /* !_countof */

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 14:35:08

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...

signaler à un administrateur
Commentaire de LallThis le 15/02/2006 14:36:00

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

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 14:41:18

Ca ne marche pas non plus, c’est la déroute !!

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 15:02:19

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

signaler à un administrateur
Commentaire de LallThis le 15/02/2006 15:34:13

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

Comment tu ajoutes à ta listbox ???

LallThis

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 15:53:41

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" );
}

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 15:59:43

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"

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 16:02:17

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

signaler à un administrateur
Commentaire de LallThis le 15/02/2006 16:02:19

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

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 16:04:51

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

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 17:55:33

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.  

signaler à un administrateur
Commentaire de magic_Nono le 15/02/2006 19:22:47

arf, j'ai oublié un '_'

signaler à un administrateur
Commentaire de Tyron3 le 15/02/2006 20:06:00

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 ?

signaler à un administrateur
Commentaire de LallThis le 16/02/2006 09:42:42

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

signaler à un administrateur
Commentaire de Tyron3 le 16/02/2006 10:03:24

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.

signaler à un administrateur
Commentaire de magic_Nono le 16/02/2006 11:59:26

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.

signaler à un administrateur
Commentaire de magic_Nono le 16/02/2006 12:02:57

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);"

signaler à un administrateur
Commentaire de Tyron3 le 17/02/2006 17:22:57

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.

signaler à un administrateur
Commentaire de Arnaud16022 le 17/02/2006 21:22:57

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.

signaler à un administrateur
Commentaire de magic_Nono le 17/02/2006 21:38:29

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)

signaler à un administrateur
Commentaire de BruNews le 17/02/2006 21:47:07 administrateur CS

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.

signaler à un administrateur
Commentaire de BruNews le 17/02/2006 21:49:02 administrateur CS

Petzold ici:
http://brunews.free.fr/brunews/download/CP5.zip
http://brunews.free.fr/brunews/download/CP5Sources.zip

signaler à un administrateur
Commentaire de Tyron3 le 17/02/2006 23:05:14

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        

signaler à un administrateur
Commentaire de BruNews le 17/02/2006 23:28:08 administrateur CS

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.

signaler à un administrateur
Commentaire de Arnaud16022 le 17/02/2006 23:54:29

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

signaler à un administrateur
Commentaire de Tyron3 le 19/02/2006 03:02:23

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.      

signaler à un administrateur
Commentaire de BruNews le 19/02/2006 09:27:41 administrateur CS

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.

signaler à un administrateur
Commentaire de magic_Nono le 19/02/2006 12:25:28

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

signaler à un administrateur
Commentaire de Tyron3 le 19/02/2006 22:10:15

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.

signaler à un administrateur
Commentaire de BruNews le 19/02/2006 23:38:04 administrateur CS

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.

signaler à un administrateur
Commentaire de Tyron3 le 20/02/2006 00:39:11

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.

signaler à un administrateur
Commentaire de Battout le 08/08/2007 13:27:43

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.

signaler à un administrateur
Commentaire de Arnaud16022 le 08/08/2007 16:46:52

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.

signaler à un administrateur
Commentaire de LallThis le 09/08/2007 09:35:45

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

signaler à un administrateur
Commentaire de Battout le 09/08/2007 09:49:43

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.

signaler à un administrateur
Commentaire de LallThis le 09/08/2007 10:01:30

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);
}

signaler à un administrateur
Commentaire de Battout le 09/08/2007 16:29:28

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+

signaler à un administrateur
Commentaire de Battout le 10/08/2007 15:06:08

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+

signaler à un administrateur
Commentaire de Battout le 14/08/2007 11:12:08

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lire et ecrire dans un fichier en mode binaire [ par vbnul ] Je cherche comment lire et ecrire dans un fichier en mode binaire car on ne peut lire certains "caracteres" binaires dans les EXE par exemple.qqn pour lire/ecrire fichier texte a plusieurs colonnes [ par denini ] voilà, j'aimerais ecrire et lire sur un fichier texteJe voudrais stocker une date, une valeur et un nbet ce pour N clients.Je voudrais que le fichier ecrire et lire un fichier texte [ par denini ] voilà, j'aimerais ecrire et lire sur un fichier texteJe voudrais stocker une date, une valeur et un nbet ce pour N clients.Je voudrais que le fichier lire et ecrire un fichier en xml en c++ [ par Armandopoulos ] salut ! Des Parsers XML pour C++,j en ai deja vu plusieurs sur google tels que Xerces c++, expat, libxml++ et tant d autres,c est bien.Ce que moi jZai lire,ecrire, et sauver un fichier [ par Gipsy974 ] 1deja merci de lire mon pbpuisma kestion est comment fait on pour creer un fichier ds lekel on met des donnes.Aussi, je voudrai savoir comment "charge lire un fichier en c++ et ecrire [ par ritalinho ] Ritalinhoint main(){ ifstream fichierEntree; // Test d'ouverture de fichier char buffer[1024]; fichierEntree.open("adresse.txt", ios::in ) fichier ini avec borland c++ 5.02 [ par guignol71 ] Bonjour a tous!J'essaie depuis bientot 3 mois de cr&#233;er une m&#233;thode pour lire simplement un fichier ini. Etant donn&#233; que ce travail est Lire et ecrire dans fichier de type excel [ par Elief ] Salut a tous, J'ai parcouru en long en large et en travers ce forum mais je n'est pas trouver de reponse a cette question: comment lire et ecrire dans Comment lire un fichier INI en c ? [ par guignol71 ] Bonjour!Je cherche actuellement une m&#233;thode permettant de lire et recup&#233;rer des cl&#233;s stock&#233;s dans un fichier ini. J'utilise le lan comment lire à partir d'un fichier .dll et .ini? [ par halwas ] bonne programationbonjour,je veux avoir des information sur le materiel d'un pc en utilisant les fichiers .ini mais je ne sais pas co


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.