OVH Cloud OVH Cloud

C++ Interpreteur

16 réponses
Avatar
midtownmadnes52
Bonjour,
j'ai commencer la programmation en c++ Il y a de ca un bon moment. j'ai
apprit beaucoup. En ce moment mon programme doit lire un fichier de
configuration, et lire et interpr=E9t=E9 ce qui a dedans. le fichier est
construi comme ceci:

######################
# commentaire ici
######################
option =3D option;
option2 =3D option2;

BOn, les commentaire je susi capable de les enlever, les espace aussi,
mais a l'endroit que j'ai le plus de difficult=E9, est de stoker dans un
tableau les option =3D option; je bloque car=E9ment a cette place. Je vais
vous donner mon code, et serais bien gentil de m'aider un peu.

m_Error est la variable qui transmet les message d'erreur.

code:

int Conf::LoadConfig()
{
//cr=E9e un pointeur
FILE *FichConf;
int Carac;
int i;
int j,y;
int CONF[120][120];


//ouverture du fichier de configuration
if ((FichConf =3D fopen("config.conf", "r")) =3D=3D NULL)
{
m_Error =3D "Impossible d'ouvrir le fichier de Configuration.";
}

//Interpretation de la configuration
else {

while ((Carac =3D fgetc(FichConf)) !=3D EOF)
{
//SI c'est un commentaire
if (i =3D=3D 1){
if (Carac !=3D '\n'){
continue;
}
else{
i=3D0;
continue;
}

}




//S=E9paration des caractere
switch (Carac) {
//Commentaire
case '#' :
i =3D 1;
continue;

//espace
case ' ':
continue;

//d=E9limiteur de fonction
case '=3D':
i =3D 2;
continue;

//arrete de fonction
case ';':
i =3D 3;
continue;

default:

break;
}

//Trie des functions


printf("%c", Carac);

}


fclose(FichConf);
}
=20
}

Merci de votre pr=E9cieuse aide:)

10 réponses

1 2
Avatar
Marc Boyer
wrote:
######################
# commentaire ici
######################
option = option;
option2 = option2;

BOn, les commentaire je susi capable de les enlever, les espace aussi,
mais a l'endroit que j'ai le plus de difficulté, est de stoker dans un
tableau les option = option; je bloque carément a cette place. Je vais
vous donner mon code, et serais bien gentil de m'aider un peu.


Et si tu utilisais les facilités C++ pour lire tes données ?
Les stream, les string, getline, etc...
Parce que bon, la lecture caractère par caractère c'est
formateur, mais c'est un peu pénible...

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
midtownmadnes52
Hummm serais p-e un idée, Mais j'ai surtout fait du c, sur le c++ men
manque un peu meme énormément, mais je découvre tranquillement:P,
mais par formateur c'est quoi vous voulez dire?
Avatar
Patrick 'Zener' Brunet
Bonjour.

Je réponds à qui a
Bonjour,
j'ai commencer la programmation en c++ Il y a de ca un bon moment.
j'ai apprit beaucoup. En ce moment mon programme doit lire un fichier
de configuration, et lire et interprété ce qui a dedans. le fichier
est construi comme ceci:

######################
# commentaire ici
######################
option = option;
option2 = option2;
[...]


C'est le type de roue qu'on passe 60% de son temps à réinventer...

Il y a beaucoup de points qui ne relèvent pas de C++ lui-même, mais plutôt
des facilités de la bibliothèque de classes que vous voulez utiliser.
Deux d'entre-elles interviennent notamment : la classe "Fichier" (en mode
STDIO-texte de préférence) et la classe "String" (chaîne de texte assortie
de fonctions plus ou moins intéressantes).

Dans un premier temps donc, ouvrir le fichier, idéalement en mode "texte
stdio", parce qu'ensuite vous pouvez le lire ligne par ligne plutôt que
caractère par caractère. Idéalement la classe pré-traite les conditions
d'erreur.

Et dans ce contexte, la routine consiste à :
- lire des lignes entières dans un tampon de type String,
- chercher le premier caractère non-blanc (attention: espaces ou tabs) et
ignorer la ligne si c'est un '#',
- sinon chercher le premier '=',
- découper de part et d'autre pour récupérer séparément la clé et la valeur,
- faire un "trim" des blancs à gauche et à droite pour chacune,
- les utiliser puis réitérer jusqu'à la fin de fichier (échec de lecture de
ligne).

Avec les classes MFC par exemple, vous avez tout ce qu'il faut dans
CStdioFile et CString. Selon la bibliothèque de classes, ça peut être plus
laborieux...

Cordialement,

--
/***************************************
* Patrick BRUNET
* E-mail: lien sur http://zener131.free.fr/ContactMe
***************************************/

Avatar
Marc Boyer
wrote:
Hummm serais p-e un idée, Mais j'ai surtout fait du c, sur le c++ men
manque un peu meme énormément, mais je découvre tranquillement:P,


Mais à vue de nez, tu auras plus vite fait d'apprendre à te
servir des string/stream pour ce code que d'essaye de le faire robuste
celui là.

mais par formateur c'est quoi vous voulez dire?


Que lire un fichier comme ça caractère par caractère,
c'est le genre de chose que je fais faire en TP de C et
qui permet d'apprendre des choses.
Mais ensuite, faut apprendre à utiliser des outils
plus efficaces. Quitte à rester en C, au moins
utiliser fgets et strspn.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
midtownmadnes52
Merci de vos réponce. Je crois que j'ai recu l'information
néssésaire pour réusir mon bout de code:)

merci bonne journée.
Avatar
kanze
Marc Boyer wrote:
wrote:
######################
# commentaire ici
######################
option = option;
option2 = option2;

BOn, les commentaire je susi capable de les enlever, les
espace aussi, mais a l'endroit que j'ai le plus de
difficulté, est de stoker dans un tableau les option =
option; je bloque carément a cette place. Je vais vous
donner mon code, et serais bien gentil de m'aider un peu.


Et si tu utilisais les facilités C++ pour lire tes données ?
Les stream, les string, getline, etc...
Parce que bon, la lecture caractère par caractère c'est
formateur, mais c'est un peu pénible...


Déjà, vue que la syntaxe est orienté ligne, je me servirais de
getline() pour la lecture, de façon à faciliter la
resynchronisation en cas d'erreur.

La deuxième chose : il faut bien savoir si les textes à traiter
peuvent contenir le caractère '#', du genre :
xyzlabel = "### xyz ###"
Si oui, je crois que je me rebattrais déjà à lex.

Sinon, la plus simple, c'est de se servir d'un streambuf
filtrant pour ôter les commentaires, puis d'une expression
rationnelle pour découper la ligne. Voire une expression
rationnelle pour le tout :
boost::regex syntax( "s*(w*)s*=s*(w*)s*(?:#.*)?" ) ;
(avec une expression rationnelle séparée pour éliminer les
lignes vide et seulement commentaires).

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Patrick 'Zener' Brunet wrote:

Je réponds à

j'ai commencer la programmation en c++ Il y a de ca un bon
moment. j'ai apprit beaucoup. En ce moment mon programme
doit lire un fichier de configuration, et lire et interprété
ce qui a dedans. le fichier est construi comme ceci:

######################
# commentaire ici
######################
option = option;
option2 = option2;
[...]


C'est le type de roue qu'on passe 60% de son temps à réinventer...

Il y a beaucoup de points qui ne relèvent pas de C++ lui-même,
mais plutôt des facilités de la bibliothèque de classes que
vous voulez utiliser.


A priori, il va se servir de la bibliothèque standard, pour
commencer, j'espère.

Deux d'entre-elles interviennent notamment : la classe
"Fichier" (en mode STDIO-texte de préférence) et la classe
"String" (chaîne de texte assortie de fonctions plus ou moins
intéressantes).


Dans le C++, il y a la classe std::ifstream pour lire les
données, et std::string pour les stocker.

C'est tout ce qu'il y a de plus standard, et elles sont
présentes dans les versions actuelles de tous les compilateurs
que je connais.

Dans un premier temps donc, ouvrir le fichier, idéalement en
mode "texte stdio", parce qu'ensuite vous pouvez le lire ligne
par ligne plutôt que caractère par caractère. Idéalement la
classe pré-traite les conditions d'erreur.


Ça veut dire quoi, « pré-traite les conditions d'erreur ». Parce
que c'est bien l'application qui doit décider ce qu'il faut
faire en cas d'erreur -- tout ce que peut faire les classes dont
on se servent, c'est de signaler les erreurs.

Et dans ce contexte, la routine consiste à :
- lire des lignes entières dans un tampon de type String,
- chercher le premier caractère non-blanc (attention: espaces
ou tabs) et ignorer la ligne si c'est un '#',
- sinon chercher le premier '=',
- découper de part et d'autre pour récupérer séparément la cl é
et la valeur,

- faire un "trim" des blancs à gauche et à droite pour chacune,
- les utiliser puis réitérer jusqu'à la fin de fichier (échec
de lecture de ligne).


En fait, la plupart des classes des expressions rationnelles
font le tout d'un coup, sans qu'on ait besoin de s'occuper des
détails.

Avec les classes MFC par exemple, vous avez tout ce qu'il faut
dans CStdioFile et CString. Selon la bibliothèque de classes,
ça peut être plus laborieux...


Les MFC, ça existe encore ? Je croyais que même Microsoft
faisait mieux maintenant.

De toute façon, avec std::ifstream, std::string et boost::regex,
c'est l'affaire de quelque lignes, tout au plus.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Fabien LE LEZ
On 2 Jun 2005 09:24:32 -0700, :

Les MFC, ça existe encore ?


Je crois avoir lu ici même que c'est encore enseigné (ou ça l'était
très récemment).

Je croyais que même Microsoft faisait mieux maintenant.


Microsoft fait autre chose. "Mieux", ça n'engage que toi. Même s'il
doit être assez difficile de faire pire, ce n'est en aucun cas
impossible, surtout quand on a de nombreux programmeurs.

Avatar
Fabien LE LEZ
On 2 Jun 2005 09:16:31 -0700, :

boost::regex syntax( "s*(w*)s*=s*(w*)s*(?:#.*)?" ) ;


Désolé pour la digression, mais y a-t-il des liens entre les regex
façon Perl (comme ci-dessus) et les regex POSIX ?
J'ai l'impression que ce sont deux langages différents qui ont le même
nom...

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

On 2 Jun 2005 09:16:31 -0700, :

boost::regex syntax( "s*(w*)s*=s*(w*)s*(?:#.*)?" ) ;


Désolé pour la digression, mais y a-t-il des liens entre les regex
façon Perl (comme ci-dessus) et les regex POSIX ?


Ce sont quand même des variations sur un même thème.
L'utilisation de lettre pour désigner des classes
particulière n'est pas propre à perl et ne vient
vraissemblablement pas de là (emacs par exemple le fait).
Pour voir quelque chose basé sur une autre approche, va voir
le pattern matching de Snobol.

J'ai l'impression que ce sont deux langages différents qui
ont le même nom...


C'est comme les BNF, il y a des tonnes de variantes (dont
certaines permettent de décrire des langages qui ne sont pas
rationnel).

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2