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 :

A propos de std::istreambuf_iterator<>


Sujet :

C++

  1. #1
    Membre confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Juin 2012
    Messages
    56
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2012
    Messages : 56
    Par d�faut A propos de std::istreambuf_iterator<>
    Bonsoir,

    Je rencontre quelques difficult�s pour trouver une solution lors de la lecture caract�re par caract�re d'un fichier quelconque. Je souhaiterais stocker l'adresse de l'iterator, selon une condition quelconque.

    Admettons ce code simple:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    uint64_t adr;
    std::istreambuf_iterator<char> it(f), end;
    while (it != end)
    {
        if (condition)
          adr = it -/+ 1;
    ++it;
    }
    Ma question est la suivante: Par quel moyen pourrait-on acc�der � it - 1 ou it + 1 � partir de l'it courant ?

    merci.

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Le plus simplement du monde :
    te permet d'acc�der � l'�l�ment suivant
    te permet d'acc�der � l'�l�ment pr�c�dant

    Voir, pour ne pas perdre ton it�rateur courant :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(condition){
       previous = it;
       next = it;
       --previous;
       ++next;
       /* ... */
    }
    NOTA : pense � v�rifer, apr�s avoir fait ++next ( et avant de faire --previous) que le r�sultat sera un it�rateur valide (ce qui ne sera pas le cas si previous est d�j� similaire � begin() ou si ++next est �gal � end() )... Autrement, tu risque d'avoir "quelques probl�mes"
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, H�rault (Languedoc Roussillon)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par d�faut
    On ne peut pas. istream_iterator est un input_iterator_tag et comme tous les input_iterator il ne supporte rien d'autre que ++it.
    Tu peux faire un buffer circulaire sur 3 valeurs (ou 2 avec la valeur courante de l'it�rateur comme �tant la troisi�me).

    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
    struct {
      static constexpr buf_size = 3;
     
      char operator[](size_t idx) const { return buf[(idx + i) % buf_size]; }
      void add(char c) { buf[i++ % buf_size] = c; }
      size_t max_size() const { return buf_len; }
     
    private:
      size_t i = 0;
      char buf[buf_size];
    } buf;
     
    uint64_t adr;    
    std::istreambuf_iterator<char> it(f), end;
     
    for (size_t i = 1; i < buf.max_size() && it != end; ++i) {
      buf.add(*it++);
    }
    while (it != end)  
    {
        buf.add(*f++);
        if (condition)   
          adr = buf[0 à 2];
        ++it;
    }
    (Pas test�)

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. A propos de std::streambuf
    Par bowow dans le forum C++
    R�ponses: 10
    Dernier message: 14/05/2015, 15h33
  2. R�ponses: 18
    Dernier message: 19/08/2011, 16h21
  3. R�ponses: 2
    Dernier message: 05/04/2009, 15h20
  4. A propos de std::ostrstream
    Par camboui dans le forum SL & STL
    R�ponses: 20
    Dernier message: 08/01/2009, 18h21
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    R�ponses: 2
    Dernier message: 24/07/2002, 09h18

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