IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

[ifstream] pb lecture fichier non sequentielle


Sujet :

SL & STL C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Par défaut [ifstream] pb lecture fichier non sequentielle
    Bonjour,

    Dans un programme, je lit un fichier de parametres dans lequel sont places plusieurs tags qui me servent a reconnaitre ou se trouve mes differents paramatres. Je ne veux pas imposer d'ordre dans le fichier de parametres, certains parametres sont optionels et j'utilise /# #/ pour commenter certaines parties du fichier.

    J'ai donc realise une fonction qui prend en entree une variable ifstream et une chaine de caractere correspondant a un tag recherche. Dans cette fonction je lit le flux (en sautant les parties commentees) jusqu'a trouver le tag ou arriver a la fin du flux si le tag (optionel) n'est pas present.
    Mon probleme est qu'en sortie de la fonction mon objet ifstream se retrouve a null dans le cas ou le tag recherche n'etait pas presente et donc ou le flux a ete lu jusqu'a eof.
    Comment peut on lire un flux sans perdre l'objet ifstream afin de le relire ensuite ?


    Ci dessous le code ne ma fonction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void FindTag(istream & fic, char* tag)
    {
      string buff;
      buff.erase();
     
      /* remise au debut du fichier */
      fic.seekg(0, ios::beg);
     
      while ( std::getline( fic, buff ) )
        {
          /* saut de commentaire */
          if(!buff.find("/#",0))
    	{
    	  while(std::getline( fic, buff ))
    	    if(!buff.find("#/",0)) break;
    	}
          else
    	if(!buff.find(tag,0)) break;
        }
    }
     
     
    Utitisation :
     
    int main(void)
    {
    ......
    ifstream fichier;
    fichier.open("nomfic.txt",ios::in);
     
    /* Recherche permier tag */
    FindTag(fichier,"<premier tag>");
     
    !!!! Pb si premier tag n'est pas trouve alors fichier = 0
     
    /* Recherche deuxieme tag */
    FindTag(fichier,"<deuxieme tag>");
    ......
    }
    Voila, j'espere avoir ete clair. Je n'ai pas trouve ailleurs d'infos qui m'aurrait debloque et j'espere que quelqu'un pourra me proposer une solution.

    Merci
    LB


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si le flux est dans un état invalide (fin de fichier atteinte dans ton cas) il faut le remettre en état de marche avec flux.clear(). Ensuite si tu reviens au début du fichier avec seekg ça devrait fonctionner.

    Mais ce n'est pas la solution la plus performante / pratique, tu peux récupérer tes paramètres une fois pour toute et les stocker par exemple dans un std::map.

    Ou mieux : si tes fichiers ressemblent à des .ini, tu peux utiliser une bibliothèque qui gère ça (boost::program_options ?).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Par défaut merci bcp
    Merci beaucoup d'une part pour la reponse et d'autre part pour la rapidite avec laquelle tu as repondu a ma question (10min). Je me sents un peu naze en voyant que la reponse etait aussi simple.... merci bcp encore

    LB

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    Oui. Boost.program_options.

    Sinon, avec des streambuf filtrants, il est facile (tout en ayant un code propre) d'ignorer les commentaires d'un fichier.
    Je m'en était servi pour filtrer un flux qui étaient ensuite utilisé dans un ancien équivalent (personnel qui tournait avec VC6) de boost.program_option.

    Après, la grosse solution peut consister à passer par un vrai parseur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/11/2010, 19h56
  2. Réponses: 2
    Dernier message: 23/06/2009, 08h42
  3. [Ifstream] Lecture fichier et mémoire
    Par michaeljeru dans le forum SL & STL
    Réponses: 4
    Dernier message: 28/01/2008, 21h57
  4. Probleme lecture fichier acces sequentiel
    Par ouar dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/09/2005, 13h39
  5. Réponses: 4
    Dernier message: 25/06/2005, 12h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo