Récupérer des valeurs d'un fichier texte dans des variables ! [VC++] - Programmation
Marsh Posté le 12-04-2001 à 12:33:46
Ce n'est peut-être pas la méthode la meilleure pour charger des fichiers mais moi j'emploie le code suivant pour gerer mes fichiers textes et ca fonctionne très bien :
CString filename = "unfichier.txt"
CFile fictext;
BOOL hr = fictext.Open(filename, CFile::modeReadWrite);
if (hr == 0)
{
//////////////////////////////////////////////////////////
// Le fichier n'existe pas////////////////////////////////
}
else
{
// Fichier existant, on le lit
CString encours = "";
CStringArray temp;
long compteur = 1;
char data[1];
char rt[2] = "\r"; char ln[2] = "\n";
do
{
fictext.Read(data, 1);
if (data[0] != rt[0] && data[0] != ln[0])
encours = encours + data[0];
else
{
fictext.Seek(1, CFile::current);
temp.SetAtGrow(compteur, encours);
compteur++; encours = "";
}
}
while (fictext.GetLength() != fictext.GetPosition());
fictext.Close();
En sortie, tu as un tableau de CString (temp) contenant chacun une ligne du fichier texte.
Il te reste à analyser chaque ligne (.Find) pour trouver à quelle variable cela correspond.
Le nombre d'éléments est dans "compteur" (de 1 à compteur)
Si tu as d'autres questions n'hésites pas !
@+
Flying
[edit]--Message édité par Flying--[/edit]
Marsh Posté le 12-04-2001 à 12:40:14
Si ton fichier est un vrai fichier d'initialisation il existe une floppé(e ?) de fonction pré-câblée :
getprivateprofilestring(...)
getprivateprofileint(...)
jettes-y un oeil .
Marsh Posté le 12-04-2001 à 13:26:20
Justement, ce n'est pas un vrai fichier d'initialisation, je ne peux donc pas utiliser les fonctions "précablées"...
Merci Flying, décidemment, c'est toujours toi qui t'occupes de moi
C'est super cool
Par contre, y'a un truc qui va pas : je peux pas compiler, parce que il veut pas que j'utilise CFile comme classe...est-ce qu'elle marche pour une dialogbox ?? Que faut il faire alors ?
Marsh Posté le 12-04-2001 à 13:41:16
Ben oui cela fonctionne dans une dialogbox, d'ailleurs j'ai fait un copier-coller d'un de mes programmes qui est sous forme de boite de dialogue.
Par contre je vois pas pq il veut pas compiler !!!! Il ne faut aucun include je pense.
Qu'as-tu comme message d'erreur ?
@+
Flying
Marsh Posté le 12-04-2001 à 13:42:48
As-tu bien :
#include "stdafx.h" dans ton programme ?
Sinon essaies aussi : #include <afx.h>
mais avec le premier cela devrait fonctionner ...
@+
Flying
Marsh Posté le 12-04-2001 à 18:00:51
Non, ben, c'est bon, en fait j'avais pas vu, mais il manquait un ridicule ";" à la fin de la première ligne
C'est bête, mais tout plantait, je vais enfin pouvoir continuer : merci à toi
Marsh Posté le 12-04-2001 à 20:41:14
Bon, maintenant, j'ai un autre problème :
J'ai grâce au code de Flying beaucoup avancé, mais j'ai récupéré des CString sous la forme :
CString szChaine1 = ""CATEGORIE1"="Valeur1"";
Ce qui fait que dans mes EDIT BOX ce sont des trucs du styles :
"CATEGORIE1"="Valeur1" qui apparaissent, avec les guillemets, et le titre de la rubrique (CATEGORIE1), or j'aimerais obtenir à partir de cette CString une CString du genre : Valeur1 : TOUT COURT !
Comment puis-je retirer les guillemets, et le "CATEGORIE1" de la chaîne ??
Marsh Posté le 12-04-2001 à 22:43:48
Utilise sscanf.
if (fgets(Buffer, 255, fStream) )
{
sscanf(Buffer, """%s""=""s""", chaine1, chaine2);
}
Marsh Posté le 12-04-2001 à 23:12:39
Tu peux aussi faire comme cela :
CString var = "CATEGORIE1=Valeur1"; // La variable "brute"
CString clean_var = ""; // La variable "nettoyée"
long i, len;
len = strlen(var); // Longeur de la chaine
i = var.Find("=", 0); // index d'un caractère de controle
clean_var = var.Mid(i+1, len-(i+1)); // On récupère ce qui nous intéresse
@+
Flying
Marsh Posté le 12-04-2001 à 23:19:53
euh ... petite précision : l'utilisation de sscanf remplace tout, fStream pointe sur le fichier ini.
La fonction complète donne ça :
char Buffer[256], chaine1[256], chaine2[256];
FILE *fStream = fopen("toto.ini", "r" );
if (fStream)
{
while (fgets(Buffer, 255, fStream) )
{
sscanf(Buffer, """%s""=""%s""", chaine1, chaine2);
}
}
bon évidemment dans mon exemple t'écrase chaine1 et chaine2 à chaque fois, faut affiner...
[edit]--Message édité par z51--[/edit]
Marsh Posté le 13-04-2001 à 00:44:36
Bon, et bien un grand merci à vous deux, pour la lecture, maintenant, c'est no problemo !
Ca marche impec' ! Par contre, je me heurte à un autre problème (eh oui, encore, le chemin pour arriver à la connaissance est long et semé d'embûches ), et pas des moindres : l'enregistrement...
Toutes les chaînes que j'ai récupéré dans mes editbox sont modifiées, et j'aimerais enregistrer les modifications, comment dois-je faire ?
Vous me ferez pensez à vous offrir un cadeau à Noël parce que sans vous je me serais surement pendu à l'heure qu'il est
Marsh Posté le 13-04-2001 à 01:11:47
Bah tu effaces le fichier et en ré-écrit un nouveau.
Vois la documentation pour info complète (CFile)
Methode Write() pour écrire
CFile::Remove() pour effacer
BOOL hr = fictext.Open(filename, CFile::modeReadWrite|CFile::modeCreate); pour créer le fichier
Bonne nuit
Flying
Marsh Posté le 12-04-2001 à 12:16:42
J'ai un fichier texte style *.ini, qui se présente sous la forme suivante :
"CATEGORIE1"="Valeur1"
"CATEGORIE2"="Valeur2"
"CATEGORIE3"="Valeur3"
etc...
J'aimerais pouvoir récupérer les valeurs de chaque catégorie pour ensuite les renvoyer des des Edit Box et les modifier par l'intermédiaire d'une dialog box...Coment faire pour récupérer ces valeurs ?
Je précise que je suis sous VC++ et que évidemment, je programme en C++.
J'ai cherché du coté des fonctions fgets(), etc, mais je n'arrive à rien...
Pourriez-vous me dépannez, avez-vous des exemples, des sources, y'a pas moyen de faire ce que je veux avec les MFC ?
Merci d'avance !