[C++ et MFC] fichier ini

fichier ini [C++ et MFC] - C++ - Programmation

Marsh Posté le 06-05-2003 à 15:39:14    

Y a t'il une différence entre un fichier ini et un fichier normal (.text ou .dat par exemple) au niveau programmation ?
J'aimerais faire un fichier ini pour mon programme utilisant les MFC.  
Ca fait très longtemps que je n'ai pas fait de lectures/ecritures dans les fichiers, et je n'ai pas msdn.
En parcourant sur le msdn online, j'ai découvert la classe CFile, mais les méthodes ne me paraissent pas très claires...
Y a t'il les mêmes possibilités entre CFile et ce bon vieux FILE * avec ses fopen, fscanf, fprintf, fread et fwrite ?
 
Merci d'avance pour vos renseignements

Reply

Marsh Posté le 06-05-2003 à 15:39:14   

Reply

Marsh Posté le 06-05-2003 à 15:40:30    

Un fichier ini tu mets ce que tu veux dedans...En général c'est des fichiers texte, tout simplement!

Reply

Marsh Posté le 06-05-2003 à 15:42:05    

il n'y a pas de syntaxe spéciale à respecter ?
genre les
[gnagna]
var1=
var2=
var3=
 
[gnagna2]
var1b=
...
 ??

Reply

Marsh Posté le 06-05-2003 à 15:44:21    

skeye a écrit :

Un fichier ini tu mets ce que tu veux dedans...En général c'est des fichiers texte, tout simplement!

:non:  :non:  :non:  
oui, c'est du texte mais il existe des fonctions pour les utiliser extrement facilement
 
je crois que c'est GetPrivateProfileString et WritePrivateProfileString
 
l'avantage de ces fonctions c'est que tu n'as rien a faire!!!
Pas besoin d'ouvir le fichier, pas besoin de rechercher une section ou une clé...ca fait tout, tout seul!!!
 
Pour connaitre les arguments de ces fonctions regarde l'aide de vc++ (tape une des fonctions, selectionnes la, puis F1)


Message édité par harrysauce le 06-05-2003 à 15:44:49
Reply

Marsh Posté le 06-05-2003 à 15:45:37    

harrysauce a écrit :

:non:  :non:  :non:  
oui, c'est du texte mais il existe des fonctions pour les utiliser extrement facilement
 
je crois que c'est GetPrivateProfileString et WritePrivateProfileString
 
l'avantage de ces fonctions c'est que tu n'as rien a faire!!!
Pas besoin d'ouvir le fichier, pas besoin de rechercher une section ou une clé...ca fait tout, tout seul!!!
 
Pour connaitre les arguments de ces fonctions regarde l'aide de vc++ (tape une des fonctions, selectionnes la, puis F1)


je n'ai pas msdn, mais je vais chercher tes fonctions sur la msdn online, merci :jap:

Reply

Marsh Posté le 06-05-2003 à 15:47:17    

harrysauce a écrit :

:non:  :non:  :non:  
oui, c'est du texte mais il existe des fonctions pour les utiliser extrement facilement
 
je crois que c'est GetPrivateProfileString et WritePrivateProfileString
 
l'avantage de ces fonctions c'est que tu n'as rien a faire!!!
Pas besoin d'ouvir le fichier, pas besoin de rechercher une section ou une clé...ca fait tout, tout seul!!!
 
Pour connaitre les arguments de ces fonctions regarde l'aide de vc++ (tape une des fonctions, selectionnes la, puis F1)


mea culpa...connaissais pas ces fonctions!
M'enfin à priori spa très dur de se créer son format d'ini qui va bien si on a envie hein...

Reply

Marsh Posté le 06-05-2003 à 15:49:51    

alors je viens d'aller voir ces fonctions.
Je travaille sur windows 2000, et d'après la msdn, les fonctions WritePrivateProfileString et ReadPrivateProfileString ecrivent dans la base de registre (pour les plateformes NT). Il n'y a que dans le cas de Win 95 et de Win 3.1 que ces fonctions lisent/ecrivent dans le fichier Win.ini
 
Et moi j'ai 40 variables à sauvegarder !!!
 
Il n'y a pas une autre solution par hasard ? ou que quelqu'un développe celle ci ?

Reply

Marsh Posté le 06-05-2003 à 15:50:20    

apres recherche voici les arguments :
 
WritePrivateProfileString(
    Nom_Section,
    Nom_Key,
    Chaine_de_caractere,
    Nom_Fichier     // nom du fichier
);
 
GetPrivateProfileString(
    Nom_Section,
    Nom_Key,
    Default,        // string par default
    Destination,
    Taille_destination,
    Nom_Fichier     // nom du fichier
);
 
 
 
Si tu as un fichier test.ini contenant ca :
 
[sect1]
key1 = riri
key2 = fifi
key3 = loulou
[sect2]
oncle = donald
tante = daisy
 
 
 
et que tu veux connaitre la valeur de la clé "oncle" de la section "sect2" tu fais :
 
GetPrivateProfileString(
    "sect2",
    "oncle",
    "",        // string par default
    string_desti,
    taille_max,
    "test.ini"     // nom du fichier
);
 
 
Si tu veux rajouter une clé "ami"  dans la section "sect2", tu fais :
 
WritePrivateProfileString(
    "sect2",
    "ami",
    "mickey",
    "test.ini"     // nom du fichier
);
 
 
 
Voila, en esperant que c'est bien ce que tu cherchais ;)

Reply

Marsh Posté le 06-05-2003 à 15:51:42    

backdafuckup a écrit :

alors je viens d'aller voir ces fonctions.
Je travaille sur windows 2000, et d'après la msdn, les fonctions WritePrivateProfileString et ReadPrivateProfileString ecrivent dans la base de registre (pour les plateformes NT). Il n'y a que dans le cas de Win 95 et de Win 3.1 que ces fonctions lisent/ecrivent dans le fichier Win.ini
 
Et moi j'ai 40 variables à sauvegarder !!!
 
Il n'y a pas une autre solution par hasard ? ou que quelqu'un développe celle ci ?
 


sisi, ca marche ss win2000, c'est juste que depuis win2000 microsoft recommande d'utiliser la base de registre plutot que les .ini.......mais rien ne t'empeche de le faire qd meme...

Reply

Marsh Posté le 06-05-2003 à 15:54:18    

skeye a écrit :


mea culpa...connaissais pas ces fonctions!
M'enfin à priori spa très dur de se créer son format d'ini qui va bien si on a envie hein...

ben ce format la est tres bien!! Ca sert a rien de reinventer la roue :D

Reply

Marsh Posté le 06-05-2003 à 15:54:18   

Reply

Marsh Posté le 06-05-2003 à 15:56:33    

harrysauce a écrit :

ben ce format la est tres bien!! Ca sert a rien de reinventer la roue :D


J'aime bien réinsventer la roue, moi...:D
'fin bon comme dhab tout dépend de ce qu'il veut faire...si c'est juste pour enregistrer 2/3 variables autant faire un truc tout con qui écrit betement dans un fichier, non?

Reply

Marsh Posté le 06-05-2003 à 15:58:41    

skeye a écrit :


J'aime bien réinsventer la roue, moi...:D
'fin bon comme dhab tout dépend de ce qu'il veut faire...si c'est juste pour enregistrer 2/3 variables autant faire un truc tout con qui écrit betement dans un fichier, non?


Ben j'appréciais bien le concept de "fichier de démarrage", et puis j'ai 40 variables à sauvegarder (pour l'instant c'est de la sauvegarde, mais après ca sera lu sur un port série, c'est pour ca qu'il me fallait un truc rapide, et le coup des sections me semble pas mal en fait...)

Reply

Marsh Posté le 06-05-2003 à 16:00:03    

skeye a écrit :


J'aime bien réinsventer la roue, moi...:D
'fin bon comme dhab tout dépend de ce qu'il veut faire...si c'est juste pour enregistrer 2/3 variables autant faire un truc tout con qui écrit betement dans un fichier, non?

ben non parce que meme pour 2/3 variables avec les fonctions toutes faites c'est fait en 2/3 lignes, tandis que si tu refais les fonctions ca prendra bien plus.....
 
Et puis si tu refais les fonctions, il faut gérer tous les cas d'erreur.....et la y'a un petit peu de boulot qd meme
Genre la fonction qui ajoute (Write....) si la clé existe deja, ca la modifie....


Message édité par harrysauce le 06-05-2003 à 16:00:51
Reply

Marsh Posté le 06-05-2003 à 16:01:07    

backdafuckup a écrit :


Ben j'appréciais bien le concept de "fichier de démarrage", et puis j'ai 40 variables à sauvegarder (pour l'instant c'est de la sauvegarde, mais après ca sera lu sur un port série, c'est pour ca qu'il me fallait un truc rapide, et le coup des sections me semble pas mal en fait...)

ca marche?

Reply

Marsh Posté le 06-05-2003 à 16:02:00    

harrysauce a écrit :

ben non parce que meme pour 2/3 variables avec les fonctions toutes faites c'est fait en 2/3 lignes, tandis que si tu refais les fonctions ca prendra bien plus.....
 
Et puis si tu refais les fonctions, il faut gérer tous les cas d'erreur.....et la y'a un petit peu de boulot qd meme
Genre la fonction qui ajoute (Write....) si la clé existe deja, ca la modifie....


bon bon jdis plus rien moi... :kaola:  
En tout cas il a tout ce qu'il faut avec tes réponses pour faire ce qu'il veut...

Reply

Marsh Posté le 06-05-2003 à 16:08:39    

skeye a écrit :


bon bon jdis plus rien moi... :kaola:  
En tout cas il a tout ce qu'il faut avec tes réponses pour faire ce qu'il veut...

:lol:

Reply

Marsh Posté le 06-05-2003 à 16:09:22    

j'y travaille....
Le problème est que Visual C++ 6 (qui montre la syntaxe dès que tu commences à taper la fonction) ne me donne pas les memes paramètres que toi...
 
moi j'ai WritePrivateProfileString(ApplicationName, Keyname, string, filename)...
 
Donc je n'ai pas de section... La fonction WritePrivateProfileString, elle dépend de quelle classe ? CWinApp ??

Reply

Marsh Posté le 06-05-2003 à 16:12:57    

backdafuckup a écrit :

j'y travaille....
Le problème est que Visual C++ 6 (qui montre la syntaxe dès que tu commences à taper la fonction) ne me donne pas les memes paramètres que toi...
 
moi j'ai WritePrivateProfileString(ApplicationName, Keyname, string, filename)...
 
Donc je n'ai pas de section... La fonction WritePrivateProfileString, elle dépend de quelle classe ? CWinApp ??

t'es sur qu'il a pas d'autres entetes "en stock"???
T'as pas une petite fleche a gauche du "WritePrivateProfileString(ApplicationName, Keyname, string, filename)...
"?????
 
je vais aller voir sur le msdn....

Reply

Marsh Posté le 06-05-2003 à 16:14:02    

Non WritePrivateProfileString c est Win32
 

Code :
  1. The WritePrivateProfileString function copies a string into the specified section of the specified initialization file.
  2. This function is provided for compatibility with 16-bit Windows-based applications. WIn32-based applications should store initialization information in the registry.
  3. BOOL WritePrivateProfileString(
  4.   LPCTSTR lpAppName,  // pointer to section name
  5.   LPCTSTR lpKeyName,  // pointer to key name
  6.   LPCTSTR lpString,   // pointer to string to add
  7.   LPCTSTR lpFileName  // pointer to initialization filename
  8. );


 
C'est la version Get/WriteProfileString/Int qui fait partit de CWinApp (et qui utilise la bdr pour les noyaux NT.

Reply

Marsh Posté le 06-05-2003 à 16:15:10    

:lol: :lol: :lol:
 
le ApplicationName correspond au nom de la section ;)
 
fais un copier/coller de mon exemple et regarde si ca marche...
 
edit : grillé  :sweat:


Message édité par harrysauce le 06-05-2003 à 16:16:23
Reply

Marsh Posté le 06-05-2003 à 16:17:50    

VisualC++ a écrit :

Non WritePrivateProfileString c est Win32
 

Code :
  1. The WritePrivateProfileString function copies a string into the specified section of the specified initialization file.
  2. This function is provided for compatibility with 16-bit Windows-based applications. WIn32-based applications should store initialization information in the registry.
  3. BOOL WritePrivateProfileString(
  4.   LPCTSTR lpAppName,  // pointer to section name
  5.   LPCTSTR lpKeyName,  // pointer to key name
  6.   LPCTSTR lpString,   // pointer to string to add
  7.   LPCTSTR lpFileName  // pointer to initialization filename
  8. );


 
C'est la version Get/WriteProfileString/Int qui fait partit de CWinApp (et qui utilise la bdr pour les noyaux NT.


 
Mais alors j'utilise quoi moi pour sauvegarder mes 40 variables ????
je voulais les sauvegarder dans un .ini, et on m'a montré ca... j'en fais quoi maintenant ? Parce que moi je travaille sous win2000 !
Et est ce que GetPrivateProfileString permet de récupérer vraiment des entiers en sortie ?
 

Reply

Marsh Posté le 06-05-2003 à 16:19:35    

:whistle:

Reply

Marsh Posté le 06-05-2003 à 16:20:05    

backdafuckup a écrit :


 
Mais alors j'utilise quoi moi pour sauvegarder mes 40 variables ????
je voulais les sauvegarder dans un .ini, et on m'a montré ca... j'en fais quoi maintenant ? Parce que moi je travaille sous win2000 !
Et est ce que GetPrivateProfileString permet de récupérer vraiment des entiers en sortie ?
 
 


ce que je t'ai montré marchera, meme sous 2000 (meme si microsoft le deconseille, au profit de la base de registre).....
apres si tu veux un entier il faudra le convertir....
(si tu recuperes un char* tu peux utiliser "atoi" )


Message édité par harrysauce le 06-05-2003 à 16:20:52
Reply

Marsh Posté le 06-05-2003 à 16:21:11    

backdafuckup a écrit :


 
Et est ce que GetPrivateProfileString permet de récupérer vraiment des entiers en sortie ?


 
Ben oui, si tu convertis la chaine de char en int (avec atoi())
 
Note 1 : les INI c'est dépassé. L'époque où on s'"amusait" à bidouiller un INI est heureusement révolu.
Note 2 : la base de registre permet de sauver des profiles différent pour chaque user


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 06-05-2003 à 16:21:39    

harrysauce a écrit :


ce que je t'ai montré marchera, meme sous 2000 (meme si microsoft le deconseille, au profit de la base de registre).....
apres si tu veux un entier il faudra le convertir....
(si tu recuperes un char* tu peux utiliser "atoi" )


Ca je sais, merci, mais s'il existe un GetPrivateProfileInt, pourquoi ne pas s'en servir si cette fonction fait bien ce qu'elle semble faire... non ?

Reply

Marsh Posté le 06-05-2003 à 16:24:01    

backdafuckup a écrit :


Ca je sais, merci, mais s'il existe un GetPrivateProfileInt, pourquoi ne pas s'en servir si cette fonction fait bien ce qu'elle semble faire... non ?
 


je savais pas qu'elle existait celle la :D

Reply

Marsh Posté le 06-05-2003 à 16:34:54    

ben j'ai vérifié, elle existe, mais à ton avis, est ce que ca marche si on écrit avec WritePrivateProfileString et qu'on lit avec GetPrivateProfileInt ?

Reply

Marsh Posté le 06-05-2003 à 16:36:06    

backdafuckup a écrit :

ben j'ai vérifié, elle existe, mais à ton avis, est ce que ca marche si on écrit avec WritePrivateProfileString et qu'on lit avec GetPrivateProfileInt ?


 
j'ai jamais testé mais ça doit parfaitement marcher puisqu'au final tout est stocké sur des char.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 06-05-2003 à 16:36:50    

Tetragrammaton IHVH a écrit :


 
j'ai jamais testé mais ça doit parfaitement marcher puisqu'au final tout est stocké sur des char.


:jap:

Reply

Marsh Posté le 06-05-2003 à 17:14:08    

Je vous remercie beaucoup messieurs, ca marche à merveille...
Un seul détail me tiraille un peu :
 

Code :
  1. Vr1 = GetPrivateProfileInt("CCD Voltages","Vr1",Vr1,"CCD.ini" );


 
A quoi sert le paramètre 3 (ici Vr1 nommé par msdn int nDefault) si on met Vr1 = ...    
Je pensais qu'il serait initialisé en paramètre 3, et non par une affectation...
 
C'est moi qui n'ait rien compris ou il y a autre chose ?

Reply

Marsh Posté le 06-05-2003 à 17:21:29    

le parametre 3 c'est la chaine par defaut, c'est ce qu'il va te renvoyer s'il ne trouve pas la clé que tu lui a filé.

Reply

Marsh Posté le 06-05-2003 à 17:22:39    

harrysauce a écrit :

le parametre 3 c'est la chaine par defaut, c'est ce qu'il va te renvoyer s'il ne trouve pas la clé que tu lui a filé.


C'est donc en quelque sorte l'entier qui sera affecté s'il ne trouve pas la clé. C'est bien ca ?
oui, ca à l'air d'être ca...

Reply

Marsh Posté le 06-05-2003 à 17:23:37    

backdafuckup a écrit :


C'est donc en quelque sorte l'entier qui sera affecté s'il ne trouve pas la clé. C'est bien ca ?
oui, ca à l'air d'être ca...

si tu utilise Get*Int oui, sinon c'est une chaine....

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed