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

C++ Discussion :

ifstream::putback plante au 4096ème élément


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Points : 12
    Points
    12
    Par défaut ifstream::putback plante au 4096ème élément
    Bonjour,

    je réalise un parser en C++.
    Je viens donc ouvrir un ifstream, puis je viens lire les caractères à l'aide des fonctions peek() ou get(), et parfois je dois replacer des caractères consommés ce que je fais grâce à un putback()Tout se déroule très bien jusqu'à ce qu'un putback soit en échec. Je passe systématique par cette fonctions statique, qui me permet de contrôler le good() avant et après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void DTD_Static::putback(basic_ifstream<TYPE>* bifs, TYPE c)
    {
      UTL_REQUIRE(bifs->good());
      bifs->putback(c);
      UTL_ENSURE(bifs->good());
    }
    J'ai découvert que cette erreur arrive alors qu'un compteur arrive à zéro (désolée, je suis sous Visual au boulot et sous minGW à la maison et là j'ai plus le nom sous la main). Mais j'ai trouvé que ce compteur qui décrémente était initialisé à 4096 à l'ouverture du fichier.

    Alors oui, j'ai vu que je pouvais mapper le contenu de mon fichier dans un buffer char* à l'aide de la fonction read et de la taille du fichier, mais alors je perd le bénéficie des putback, get et autre peek.

    Est-ce qu'il existe une solution de faire glisser le contenu à un instant T ? Merci.

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Bonjour,

    de retour sous Visual le debug est plus aisé
    Voilà en fait le problème :

    je fais N get() successifs puis je remets les N caractères avec N putback()
    Or si au cours de ses N get() le filebuf a glissé modulo 4096, alors le putback ne peux plus revenir en arrière.

    comment corriger ça ?

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si tu remets les caracteres que tu as lus et que tu peux te contraindre a des fichiers (plutot que des streams connectes a un terminal ou un port reseau), tu peux utiliser les fonctions de positionnement (tellg/seekg).

    Si tu ne peux pas, tu ecris un streambuf qui fait du buffering et te permet de controler la quantite de putback que tu peux utiliser tout en delegant le reste des operations a un autre streambuf.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. [Algo] Trouver un arrangement ou une combinaison d'éléments
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 16
    Dernier message: 20/04/2013, 11h46
  3. Supprimer un élément d'un tableau
    Par CaptainChoc dans le forum Langage
    Réponses: 15
    Dernier message: 23/12/2002, 23h14
  4. Réponses: 3
    Dernier message: 16/12/2002, 16h12
  5. Réponses: 2
    Dernier message: 23/10/2002, 13h38

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