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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    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 éclairé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 301
    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....

+ 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