Fichier avec ligne de commentaire

Le
Dominique MICOLLET
Bonjour,

Je souhaite lire un fichier contenant des données textuelles rigoureusement
formatées, au milieu desquelles traînent, au hasard, des lignes de
commentaires repérables par le fait qu'elles débutent par un # (les
habitués d'Unix reconnaîtront :-) )

Un solution basique consiste à nettoyer le fichier à l'avance à coup de
grep.

Mais je préfèrerais une solution consistant à dériver un istream, pour
lequel je modifierais l'opérateur << afin qu'il se comporte normalement
pour toute ligne ne débutant pas par #, et qu'il avale silencieusement
toute ligne qui débuterait par ce #.

Ce qui m'éviterait de trop modifier le programme qui exploite déjà ces
fichiers nettoyés de leurs commentaires.

Est ce que ça vous semble réalisable, et auriez vous une piste à me
suggérer ?

PS : je remercie les personnes qui m'ont orienté sur regex pour mon problème
d'analyse syntaxique ; il y a un gros investissement à faire pour la
première mise en oeuvre, largement rentabilisé par la puissance de l'outil.


Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michael DOUBEZ
Le #305008
Bonjour,

Je souhaite lire un fichier contenant des données textuelles rigoureusement
formatées, au milieu desquelles traînent, au hasard, des lignes de
commentaires repérables par le fait qu'elles débutent par un # (les
habitués d'Unix reconnaîtront :-) )

Un solution basique consiste à nettoyer le fichier à l'avance à coup de
grep.

Mais je préfèrerais une solution consistant à dériver un istream, pour
lequel je modifierais l'opérateur << afin qu'il se comporte normalement
pour toute ligne ne débutant pas par #, et qu'il avale silencieusement
toute ligne qui débuterait par ce #.

Ce qui m'éviterait de trop modifier le programme qui exploite déjà ces
fichiers nettoyés de leurs commentaires.

Est ce que ça vous semble réalisable, et auriez vous une piste à me
suggérer ?



J'espère que James Kanze ne m'en voudra pas de conseiller à sa place sa
bibliothèque.
http://kanze.james.neuf.fr/doc/en/IO/html/classGabiNS_1_1FilteringIstream.html
Voici l'exemple correspondant, il doit être adaptable sans trop d'effort.
http://kanze.james.neuf.fr/code/Util/IO/FilteringInputStream/testinp.cc


Michael

Jean-Marc Bourguet
Le #305007
Dominique MICOLLET
Mais je préfèrerais une solution consistant à dériver un istream, pour
lequel je modifierais l'opérateur << afin qu'il se comporte normalement
pour toute ligne ne débutant pas par #, et qu'il avale silencieusement
toute ligne qui débuterait par ce #.


Il faut faire un streambuf. La FAQ, le site de James et les archives
fournissent pas mal d'info (pour les archives, chercher streambuf
filtrant).

A+

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

James Kanze
Le #305006
On Mar 21, 9:06 am, Michael DOUBEZ
Je souhaite lire un fichier contenant des données textuelles rigoureu sement
formatées, au milieu desquelles traînent, au hasard, des lignes de
commentaires repérables par le fait qu'elles débutent par un # (les
habitués d'Unix reconnaîtront :-) )

Un solution basique consiste à nettoyer le fichier à l'avance à c oup de
grep.

Mais je préfèrerais une solution consistant à dériver un istrea m, pour
lequel je modifierais l'opérateur << afin qu'il se comporte normaleme nt
pour toute ligne ne débutant pas par #, et qu'il avale silencieusement
toute ligne qui débuterait par ce #.

Ce qui m'éviterait de trop modifier le programme qui exploite déj à ces
fichiers nettoyés de leurs commentaires.

Est ce que ça vous semble réalisable, et auriez vous une piste à me
suggérer ?


J'espère que James Kanze ne m'en voudra pas de conseiller à sa place sa
bibliothèque.http://kanze.james.neuf.fr/doc/en/IO/html/classGabiNS_1_1F ilteringIst...
Voici l'exemple correspondant, il doit être adaptable sans trop d'effor t.http://kanze.james.neuf.fr/code/Util/IO/FilteringInputStream/testinp.cc


Pas du tout. C'est en effet la solution que j'utilise la plupart
du temps. J'ajouterai que s'il veut comprendre plus, il y a
aussi les articles que j'ai écrit pour _C++_ _Reports_, à
http://kanze.james.neuf.fr/articles-fr.html.

Un petit détail : tel que je l'utilise, le filtre n'enlève que
le texte entre le '#' et la fin de la ligne. Il en reste donc
des lignes vides. En général, AMHA, c'est ce qu'on veut :
d'abord, on veut accepter des lignes réelement vide de toute
façon, et on conçoit la grammaire en fonction, et deuxièmement,
en cas d'erreur, on veut afficher le numéro de la ligne dans le
message d'erreur, ce qui suppose qu'on puisse le calculer, ce
qui suppose en suite que le filtre laisse passer tous les 'n'.
(Pour ignorer les lignes vide, j'utilise :

if ( Gabi::trim( line ) != "" ) {
// traitement...
}

trim(), c'est une fonction dans StringUtils, à la même site.)

--
James Kanze (GABI Software) email:
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


Michel Decima
Le #304989
Bonjour,

Je souhaite lire un fichier contenant des données textuelles rigoureusement
formatées, au milieu desquelles traînent, au hasard, des lignes de
commentaires repérables par le fait qu'elles débutent par un # (les
habitués d'Unix reconnaîtront :-) )

Un solution basique consiste à nettoyer le fichier à l'avance à coup de
grep.

Mais je préfèrerais une solution consistant à dériver un istream, pour
lequel je modifierais l'opérateur << afin qu'il se comporte normalement
pour toute ligne ne débutant pas par #, et qu'il avale silencieusement
toute ligne qui débuterait par ce #.


Tu es sur la bonne piste, mais ce n'est pas le istream qu'il faut
deriver, c'est plutot le streambuf. L'idée, c'est que la nouvelle
classe va se comporter comme un filtre qui delegue la plupart de
ses opérations a un autre streambuf, avec l'interception des
commentaires au milieu. Ca te permet ensuite d'installer le filtre
sur n'importe quel istream, donc enlever les commentaires sur
un fichier, l'entree standard, un stringstream etc.

Pour une explication plus detaillee et surtout plus claire, tu
peux faire une recherche google avec les termes 'filtering streambuf',
les deux premieres reponses contiennent tout ce qu'il faut (et tu
reconnaitras l'auteur, c'est un habitué du forum ;)

Ce qui m'éviterait de trop modifier le programme qui exploite déjà ces
fichiers nettoyés de leurs commentaires.

Est ce que ça vous semble réalisable, et auriez vous une piste à me
suggérer ?


Tu peux le realiser toi meme, ce n'est pas tres complique. Si tu veux
une solution qui marche tout de suite, tu peux regarder Boost.IOStreams,
dans la documentation, section 2.2.3 "Shell Comments Filters".

Dominique MICOLLET
Le #304988
Réponse en moins de deux heures... Y a pas à dire, c'est réactif.
Et dire que certains ne voient pas l'intérêt des forums....

Merci à vous tous

Il ne me reste plus qu'à comprendre comment ça marche.



Dominique MICOLLET
Publicité
Poster une réponse
Anonyme