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 :

Comment utiliser les itérateurs de flux ?


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut Comment utiliser les itérateurs de flux ?
    Bonjour à tous

    J'ai un problème d'utilisation de l'exemple donné dans la faq:
    http://c.developpez.com/faq/cpp/?pag...ream_iterators
    Voici comment je compte m'en servir pour initialiser mon vecteur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fstream file;
    unsigned int i;
    file.open("./Data/Layers.txt", ios::in);
    file >> i;
    C_Layer::s_vctLayers.resize(i);
    copy(C_Layer::s_vctLayers.begin(), C_Layer::s_vctLayers.end(), istream_iterator<C_Layer>(file));
    Sachant que j'ai donc une classe C_Layer avec un attribut static public s_vctLayers de type vector<C_Layer> et que j'ai surchargé les opérateurs de flux >> et <<
    A la compilation, j'ai l'erreur suivante:
    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
     
    C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2228) : error C2678: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie gauche de type 'const C_Layer' (ou il n'existe pas de conversion acceptable)
            d:\nouveau dossier\mulhouse 13 04 07\simmulhouse\simmulhouse\fichiers sources\Graphe/C_Layer.hpp(39): peut être 'C_Layer &C_Layer::operator =(const C_Layer &)'
            lors de la tentative de mise en correspondance de la liste des arguments '(const C_Layer, C_Layer)'
            C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2282) : voir la référence à l'instanciation de la fonction modèle '_OutIt std::_Copy_opt<C_Layer*,_OutIt,std::_Iter_random_helper<_Cat1,_Cat2>::_Iter_random_cat>(_InIt,_InIt,_OutIt,_InOutItCat,std::_Nonscalar_ptr_iterator_tag,std::_Range_checked_iterator_tag)' en cours de compilation
            with
            [
                _OutIt=std::istream_iterator<C_Layer>,
                _Cat1=std::_Vector_iterator<C_Layer,std::allocator<C_Layer>>::iterator_category,
                _Cat2=std::input_iterator_tag,
                _InIt=C_Layer *,
                _InOutItCat=std::_Iter_random_helper<std::_Vector_iterator<C_Layer,std::allocator<C_Layer>>::iterator_category,std::input_iterator_tag>::_Iter_random_cat
            ]
            .\Fichiers sources\C_Data.cpp(153) : voir la référence à l'instanciation de la fonction modèle '_OutIt std::copy<std::_Vector_iterator<_Ty,_Alloc>,std::istream_iterator<_Ty>>(_InIt,_InIt,_OutIt)' en cours de compilation
            with
            [
                _OutIt=std::istream_iterator<C_Layer>,
                _Ty=C_Layer,
                _Alloc=std::allocator<C_Layer>,
                _InIt=std::_Vector_iterator<C_Layer,std::allocator<C_Layer>>
            ]
    Voilà j'espère que vous pourrez m'aider

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Là tu essayes de copier ton tableau vers un flux d'entrée. C'est l'inverse qu'il faut faire, comme très bien expliqué dans la FAQ.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Ok autant pour moi
    Voici comment je m'y suis pris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fstream file;
    unsigned int i;
    file.open("./Data/Layers.txt", ios::in);
    file >> i;
    C_Layer::s_vctLayers.resize(i);
    copy(istream_iterator<C_Layer>(file), istream_iterator<C_Layer>(), C_Layer::s_vctLayers.begin());
    Merci de ton aide

  4. #4
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Si tu veux faire plus concis, tu peux utiliser la fonction assign :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C_Layer::s_vctLayers.assign(istream_iterator<C_Layer>(file), istream_iterator<C_Layer>());

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Merci beaucoup
    Je suis en thèse en informatique et je découvre tout juste les possibilités du C++ et de la STL, c'est extrèmement puissant, élégant et concis que du bonheur....
    Merci beaucoup également à Developpez.com qui m'a permi de progresser, un super site. Et par contre, il faudrait que les profs se mettent à niveau en C++, c'est dommage de devoir autant se former par soit meme

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    j'ai de nouveau un petit problè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
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    #include <fstream>
    #include <vector>
    #include <iostream>
     
    using namespace std;
     
    struct entier
    {
    	int valeur;
    	static int cpt;
     
    	friend istream& operator>> (istream& in, entier& ent)
    	{
    		++cpt;
    		in >> ent.valeur;
    		return in;
    	}
    };
     
    int entier::cpt = 0;
     
    int main (void)
    {
    	fstream file;
    	vector<entier> l_vct;
     
    	file.open("test.txt", ios::in);
    	l_vct.assign(istream_iterator<entier>(file), istream_iterator<entier>());
    	file.close();
    	file.clear();
    	cout << entier::cpt << endl;
    	return 0;
    }
    La valeur du membre static cpt vaut à la fin de l'execution 11 or dans mon fichier texte, je n'ai que 10 valeurs (de 0 à 9) mais le vecteur est bien de taille 10. Mon problème est que lorsque par exemple, les valeurs dans le fichier correspondent à la taille d'un vecteur, ca plante... Je ne vois pas trop comment faire....

  7. #7
    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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La valeur du membre static cpt vaut à la fin de l'execution 11 or dans mon fichier texte, je n'ai que 10 valeurs (de 0 à 9) mais le vecteur est bien de taille 10
    Ton compteur vaut 1 de plus, car la lecture n'est arrêtée qu'après une extraction qui n'a pas marchée. Ainsi la dernière lecture appelera bien l'opérateur >> (donc incrémentera ton compteur), mais ne créra pas de nouvel objet puisqu'elle n'aura pas réussi.
    Si tu veux un compteur qui reflète le nombre d'extractions réussies, fais-le plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    friend istream& operator>> (istream& in, entier& ent)
    {
        if (in >> ent.valeur)
            ++cpt;
        return in;
    }
    Mon problème est que lorsque par exemple, les valeurs dans le fichier correspondent à la taille d'un vecteur, ca plante... Je ne vois pas trop comment faire....
    Comprends pas ce que tu veux dire, là.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    Points : 345
    Points
    345
    Par défaut
    Mon problème était le suivant:
    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
     
    #include <fstream>
    #include <vector>
    #include <iostream>
     
    using namespace std;
     
    struct entier
    {
    	vector<int> m_vctValeur;
    	static int cpt;
     
    	friend istream& operator>> (istream& in, entier& ent)
    	{
    		++cpt;
    		unsigned int i;
    		in >> i;
    		ent.m_vctValeur.resize(i);
    		return in;
    	}
    };
     
    int entier::cpt = 0;
     
    int main (void)
    {
    	fstream file;
    	vector<entier> l_vct;
     
    	file.open("test.txt", ios::in);
    	l_vct.assign(istream_iterator<entier>(file), istream_iterator<entier>());
    	file.close();
    	file.clear();
    	cout << entier::cpt << endl;
    	return 0;
    }
    comme la lecture échouait, il y avait plantage lors du redimensionnement du vecteur du dernier élément lu. Mais avec ta solution (tester si la lecture réussit), c'est bon, je n'ai plus de plantage, merci beaucoup pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [HTTP] Comment utiliser les POST par programation
    Par Popof dans le forum Général Conception Web
    Réponses: 9
    Dernier message: 31/01/2005, 09h14
  2. Réponses: 4
    Dernier message: 13/12/2004, 20h37
  3. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38
  4. Réponses: 11
    Dernier message: 22/12/2003, 21h06
  5. Comment utiliser les styles XP avec Dev-C++?
    Par abraxas dans le forum Dev-C++
    Réponses: 3
    Dernier message: 05/10/2003, 19h47

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