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 :

Utilisation de fstream


Sujet :

SL & STL C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut Utilisation de fstream
    Bonsoir,
    J'ai commencé à apprendre le C++ depuis 3 jours!
    J'ai un fichier data.txt qui contient UN ENTIER sur chaque ligne.
    Je voudrais extraire chacun des entiers et l'envoyer dans un tableau d'entiers.
    J'ai vu sur internet qu'il faudra peut-être utiliser la fonction fstream ? mais j'y arrive pas. quelqu'un pour m'aider ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut, et bienvenue sur le forum.

    En fait, fstream, ce n'est pas une fonction, c'est une classe fournie par le standard.

    Pour être précis, il s'agit d'ailleurs d'une classe de "gestion de flux" qui s'attaque aux problème de la gestion des flux sur les fichiers.

    La classe fstream est en réalité "subdivisée" en deux classes distinctes: ifstream qui permet d'ouvrir un fichier en lecture et ofstream qui permet de l'ouvrir en écriture.

    Comme toutes les classes fournies par le standard, il est à noter qu'elles se retrouvent dans l'espace de noms std.

    Pour pouvoir utiliser ces deux classes, il s'agit en outre d'inclure le fichier d'en-tête... <fstream>

    Pour le reste, la récupération d'un entier n'est pas particulièrement compliquée: il suffit de remplacer le cin - qui permet d'acquérir une information au départ de "l'entrée standard" (en d'autres termes: le clavier ) par la variable qui instancie ton fichier d'entrée.

    Au final, le code qui devrait te permettre de travailler est donc tout simple, et pourrait très bien prendre la forme 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
    22
    23
    24
    25
    26
    #include <fstream> // pour la gestion des fichiers
    #include <vector> // à utiliser de préférences aux tableaux "C style"
    #include <iostream> // pour profiter de l'affichage sur la console :D
     
    int main()
    {
        //Ouverture d'un fichier nommé fichier.txt en mode lecture seule
        std::ifstream ifs("fichier.txt");
        //déclaration d'un entier qui servira pour la lecture
        int lecture;
        /* déclaration d'un tableau d'entiers, bien plus sécurisant qu'un tableau 
         * "Cstyle"
         */
        std::vector<int> tab;
        /* tant que l'on arrivera à lire une valeur, on l'insérera dans le tableau */
        while ((ifs>>lecture))
        {
            tab.push_back(lecture);
        }
        /* et pour montrer que tout a bien été lu, on affiche tous les chiffres
         * "à l'écran"
         */
        for(size_t i=0;i<tab.size();i++)
            std::cout<<tab[i]<<"\t";
        return 0;
    }
    [EDIT]Il est à noter que tu peux, si tu le souhaite, envisager d'utiliser la directive using namespace std; dans les fichiers d'implémentation... ce qui permet de s'éviter l'écriture (fastidieuse ) des std:: à tout bouts de champs, mais que cette directive est clairement déconseillée à l'intérieur des fichiers d'en-tête
    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 averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    Merci pour cette réponse impeccable!
    Je croyais que en posant la question de cette façon je pourrais bidouiller la réponse et l'utiliser dans mon code, mais non!
    En fait, il faut que je lise le fichier .txt et affecter chaque entier lu à une donnée d'une classe que j'ai défini avec un pointeur sur le début du tableau.
    voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     #ifndef PHOTON_H
    #define PHOTON_H
     
    class photon
    {
       long long *tps_arrive;
       int ponderation
     
     public:
       photon();  
    } ;
     
    #endif
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "point.h"
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    photon::photon()
    {
    int i=0;
    int NbLignes;
    cout<<"Combien de lignes comporte le text :   ?\n";
    cin>>NbLignes;
    tps_arrive = new long long [NbLignes];
    .......
    }
    C'est trop demandé ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Pour information:

    Il existe une page entière dans la FAQ qui devrait répondre à l'ensemble de tes questions sur tout ce qui a trait aux fichiers... Je ne pourrais que te conseiller d'aller y jeter un oeil

    Comme je l'ai indiqué dans les commentaires, il est déconseillé d'utiliser les tableaux "C style", car la classe vector est bien plus sécurisante, et t'évite le recours épineux à l'allocation dynamique, voir l'un des autres conteneurs classiques de la STL, selon le type d'accès que tu prévois de faire sur les éléments contenus (std::vector si tu prévois un acces direct, std::list si tu prévois un acces séquentiel, voir encore un autre, selon tes besoins )

    De plus, il faut savoir que *idéalement* tu dois veiller à respecter le paradigme RAII (Ressource Acquisition Is Initialisation, ou, si tu préfères en français: l'acquisition de ressources est l'initialisation).

    Ainsi, il semblerait franchement pas mal d'envisager de modifier ta classe photon pour que, de toutes manières, le membre tps_arrive soit l'un des conteneurs de la STL dont j'ai parlé plus haut.

    Tu aurais alors deux solutions: remplir le conteneur à la lecture et le passer dans le constructeurs de ta classe photon, ou prévoir une méthode permettant de rajouter des éléments à la demande.

    En gros, la classe photon deviendrait donc:
    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
    class photon
    {
        public:
            photon():ponderation(0){}// constructeur sans fournir  les valeurs
            photon(const std::vector<long long>& tps):tps_arrive(tps)
            {
                calculePonderation();
            }
            void addTps(long long toadd)
            {
                tps_arrive.push_back(toadd);
                calculePonderation();
            }
        private:
            std::vector<long long> tps_arrive;
            int ponderation;
            void calculePonderation()
            {
                 /* je présumes que la pondération devrait être recalculée 
                  * à chaque fois... fais le ici
                  */
            }
    };
    Ensuite, tu pourrais prévoir de lire, tout simplement, le fichier sans t'inquiéter outre mesure du reste sous une forme proche de
    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
    int main()
    {
        std::ifstream ifs("le_fichier.txt");
         /* une solution parmis d'autre
          * car le nom du fichier pourrait ne pas etre codé en dur
          */
        long long lecture;
        /* solution 1 */
        std::vector<long long> tab;
        while((ifs>>lecture))
            tab.push_back(lecture);
        photon monphotontoutneuf(tab);
        /* solution 2 */
        photon monphotontoutneuf;
        while((ifs>>lecture))
            monphotontoutneuf.addTps(lecture);
        /* de toute manière, à partir d'ici, tu peux utiliser ton photon ;) 
         * ...
         */
        return 0;
    }
    [EDIT] PS :
    Au passage: le premier conseil à garder en mémoire est "aide nous à t'aider"...

    Plus tu nous fournira dés le départ des informations claires et précises, plus tu auras de chances d'obtenir rapidement une réponse claire, précise et adaptée à tes besoins
    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

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    merci pour l'explication!
    le truc est que je n'ai pas encore le niveau de manipuler la class vector.
    Je vais me contenter d'utiliser les tableaux "C style".
    maintenant j'en suis là, mais le compilateur donne une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "vecteur.h"
    #ifndef PHOTON_H
    #define PHOTON_H
     
    class photon
    {
       long long *tps_arrive;
       int ponderation;
       friend vecteur::vecteur();
    } ;
     
    #endif

    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
    #ifndef VECTEUR_H
    #define VECTEUR_H
     
    #include "photon.h"
     
    class vecteur
    {
       photon *tab_photon;
       int Nbre_photon
     
     public:
       vecteur();
    } ;
     
     
     
    #endif
    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
    #include "photon.h"
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    vecteur::vecteur()
    {
    int i=0;
    int NbLignes;
    cout<<"Combien de lignes comporte le text :   ?\n";
    cin>>NbLignes;
    tab_photon = new photon[NbLignes];
     
    //Lecture
    char c, str[256];
      ifstream is;
     
      cout << "Entrer le nom du fichier text: ";
      cin.get (str,256);
     
      is.open (str);        // open file
     
      while (is.good())     // loop while extraction from file is possible
      {
        c = is.get();       // get character from file
        tab_photon[i].tps_arrive = c;
        tab_photon[i].ponderation=(0);
        i++;
      }
     
      is.close();           // close file
     
    cout<<"tps du 2eme photon : "<<tab_photon[1].tps_arrive<<"\n Sa pondération : "<<tab_photon[1].ponderation;
     
    }
    LES erreurs:
    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
    photon.h:9: error: ‘vecteur’ has not been declared
    photon.h:9: error: ISO C++ forbids declaration of ‘vecteur’ with no type
    vecteur.h:11: error: expected ‘;’ before ‘public’
    photon.h:9: error: ‘vecteur’ has not been declared
    photon.h:9: error: ISO C++ forbids declaration of ‘vecteur’ with no type
    vecteur.h:11: error: expected ‘;’ before ‘public’
    vecteur.cpp:6: error: definition of implicitly-declared ‘vecteur::vecteur()’
    vecteur.cpp:6: error: declaration of ‘vecteur::vecteur()’ throws different exceptions
    vecteur.h:7: error: from previous declaration ‘vecteur::vecteur() throw ()’
    photon.h: In constructor ‘vecteur::vecteur()’:
    photon.h:7: error: ‘long long int* photon::tps_arrive’ is private
    vecteur.cpp:26: error: within this context
    vecteur.cpp:26: error: invalid conversion from ‘char’ to ‘long long int*’
    photon.h:8: error: ‘int photon::ponderation’ is private
    vecteur.cpp:27: error: within this context
    photon.h:7: error: ‘long long int* photon::tps_arrive’ is private
    vecteur.cpp:33: error: within this context
    photon.h:8: error: ‘int photon::ponderation’ is private
    vecteur.cpp:33: error: within this context

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Adnanius Voir le message
    le truc est que je n'ai pas encore le niveau de manipuler la class vector.
    Je vais me contenter d'utiliser les tableaux "C style".
    Argh !

    Si tu n'as pas le niveau pour manipuler des vectors, tu l'as encore moins pour manipuler des tableaux C, car ceux-ci sont bien plus complexes à manipuler que les vectors.

    C'est un peu comme si tu disais que comme c'est difficile de manipuler un GPS, tu préférais utilser le kit boussole, sextant, astrolabe et table astronomique : C'est plus lent, c'est plus complexe, et le résultat sera moins bon.

    Pour ton erruer, ne manque-t-il pas un #include "Vecteur.h" dans ton main (je n'ai pas lu le code, il y a peut-êtr ed'autres problèmes).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Vrai, std::vector c'est une des notions de bases dans l'apprentissage du C++ donc oui c'est de ton niveau!

    http://www.cppreference.com/cppvector/index.html

    C'est beaucoup plus simple que la gestion des tableaux C-style.

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    +1, c'est clair.
    Faut juste comprendre ce qu'est une classe ou une structure (c'est quand même pas trop demandé ! )

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Quant à ton problème entre les deux classes:
    http://cpp.developpez.com/faq/cpp/?p...erence_croisee
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    Juste 2 questions:
    qu'est ce qu'elle fait cette ligne ? les 2 points ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    photon(const std::vector<long long>& tps):tps_arrive(tps)
    et la variable lecture ? c'est quoi sa fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     long long lecture;
        /* solution 1 */
        std::vector<long long> tab;
        while((ifs>>lecture))
            tab.push_back(lecture);
        photon monphotontoutneuf(tab);

  11. #11
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Citation Envoyé par Adnanius Voir le message
    qu'est ce qu'elle fait cette ligne ? les 2 points ?

    photon(const std::vector<long long>& tps):tps_arrive(tps)
    Les deux points après le tps) ? C'est une liste d'initialisation, tps est copié dans tps_arrive (il faut que tps_arrive soit donc un vecteur contenant des long long. En général, il est plus efficace d'initialiser les variables membres d'une classe avec une liste d'initialisation.

    et la variable lecture ? c'est quoi sa fonction ?

    long long lecture;
    /* solution 1 */
    std::vector<long long> tab;
    while((ifs>>lecture))
    tab.push_back(lecture);
    photon monphotontoutneuf(tab);
    Je suppose que ton fichier ifs contient donc des long long ? La la boucle while sera exécutée tant qu'il y aura des valeurs à lire, puis la valeur stockée dans lecture sera copiée dans ton vecteur tab.

  12. #12
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    Merci Bakura pour ta réponse, c'est compri!
    j'ai un autre souci :
    Le programe que koala m'a proposé fait que un photon ait plusieurs tps d'arrivés et un pondération, mais moi je voudrais qu'un photon ait un seul temps d'arrivé et une pondération. Après je veux créer une classe faisceau qui sera un vector de photons.

    Citation Envoyé par koala01 Voir le message
    Pour information:

    Il existe une page entière dans la FAQ qui devrait répondre à l'ensemble de tes questions sur tout ce qui a trait aux fichiers... Je ne pourrais que te conseiller d'aller y jeter un oeil

    Comme je l'ai indiqué dans les commentaires, il est déconseillé d'utiliser les tableaux "C style", car la classe vector est bien plus sécurisante, et t'évite le recours épineux à l'allocation dynamique, voir l'un des autres conteneurs classiques de la STL, selon le type d'accès que tu prévois de faire sur les éléments contenus (std::vector si tu prévois un acces direct, std::list si tu prévois un acces séquentiel, voir encore un autre, selon tes besoins )

    De plus, il faut savoir que *idéalement* tu dois veiller à respecter le paradigme RAII (Ressource Acquisition Is Initialisation, ou, si tu préfères en français: l'acquisition de ressources est l'initialisation).

    Ainsi, il semblerait franchement pas mal d'envisager de modifier ta classe photon pour que, de toutes manières, le membre tps_arrive soit l'un des conteneurs de la STL dont j'ai parlé plus haut.

    Tu aurais alors deux solutions: remplir le conteneur à la lecture et le passer dans le constructeurs de ta classe photon, ou prévoir une méthode permettant de rajouter des éléments à la demande.

    En gros, la classe photon deviendrait donc:
    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
    class photon
    {
        public:
            photon():ponderation(0){}// constructeur sans fournir  les valeurs
            photon(const std::vector<long long>& tps):tps_arrive(tps)
            {
                calculePonderation();
            }
            void addTps(long long toadd)
            {
                tps_arrive.push_back(toadd);
                calculePonderation();
            }
        private:
            std::vector<long long> tps_arrive;
            int ponderation;
            void calculePonderation()
            {
                 /* je présumes que la pondération devrait être recalculée 
                  * à chaque fois... fais le ici
                  */
            }
    };
    Ensuite, tu pourrais prévoir de lire, tout simplement, le fichier sans t'inquiéter outre mesure du reste sous une forme proche de
    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
    int main()
    {
        std::ifstream ifs("le_fichier.txt");
         /* une solution parmis d'autre
          * car le nom du fichier pourrait ne pas etre codé en dur
          */
        long long lecture;
        /* solution 1 */
        std::vector<long long> tab;
        while((ifs>>lecture))
            tab.push_back(lecture);
        photon monphotontoutneuf(tab);
        /* solution 2 */
        photon monphotontoutneuf;
        while((ifs>>lecture))
            monphotontoutneuf.addTps(lecture);
        /* de toute manière, à partir d'ici, tu peux utiliser ton photon ;) 
         * ...
         */
        return 0;
    }
    [EDIT] PS :
    Au passage: le premier conseil à garder en mémoire est "aide nous à t'aider"...

    Plus tu nous fournira dés le départ des informations claires et précises, plus tu auras de chances d'obtenir rapidement une réponse claire, précise et adaptée à tes besoins

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    bon, une question beaucoup plus simple:
    je veux créer un nouveau photon directement à la fin du vector de photons tab_photon std::vector<photon> tab_photon;
    comment je fais ?
    parceque si j'appelle le constructeur de photons photon(), le photon créer ne sera pas à l'intérieur du vector n'est ce pas ?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Ceci peut-il convenir ?
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    tab_photon.push_back(photon());
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    pourquoi le compilateur ne reconnait pas la librairie vector

    faisceau.h:18: error: ‘vector’ is not a type

    Alors que j'ai fait inclure cette librairie :

    #include<vector>

    ???

  16. #16
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    std::vector... Sinon tu écris :
    #include <vector>
    using namespace std;

    Et tu peux t'affranchir du std:: devant le vector. C'est pourtant une question relativement basique, tu as le même fonctionnement pour cout, cerr...

  17. #17
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    mais justement, c'est bien ce que j'ai fait mais ca donne quand meme cette erreur :

    Photon.h
    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
    #ifndef PHOTON_H
    #define PHOTON_H
    #include "faisceau.h"
    using namespace std;
     
    class photon
    {
        public:
            photon();
        private:
            long long tps_arrive;
            int ponderation;
     
    };
     
    #endif
    faisceau.h
    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
    #ifndef FAISCEAU_H
    #define FAISCEAU_H
    #include<vector>
    using namespace std;
     
    class photon;
     
    class faisceau
    {
        public:
            void initialise(long long tps);
            void affichefaisceau(vector vector_a_afficher);
        private:
            vector<photon> tab_photon;
     
    };
     
    void faisceau::initialise(long long tps)
            {
                tab_photon.push_back():ponderation(0);
                tab_photon.back.tps_arrive = tps;
                calculePonderation();
            }
    void faisceau::affichefaisceau(vector vector_a_afficher)
            {
                vector_a_afficher<int>::iterator iter;
                for(iter=vector_a_afficher.begin(); iter!=vector_a_afficher.end();iter++)
                {
                    cout<<*iter<<"   \n";
     
                } 
            }
     
    #endif
    main.cpp
    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
    #include<iostream>
    #include<math.h>
    #include<vector>
    #include "photon.h"
    #include "faisceau.h"
     
    using namespace std;
     
    int main()
    {   
        faisceau faisceauInintial;
        ifstream ifs("FCSText100k.txt");
        long long lecture;
        while((ifs>>lecture))
        {
            faisceauInintial.initialise(lecture);   
        }
        affichefaisceau(faisceauInintial.tab_photon);
        return 0;
    }

    Et LES erreurs:
    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
    faisceau.h: In member function ‘void faisceau::initialise(long long int)’:
    faisceau.h:20: error: no matching function for call to ‘std::vector<photon, std::allocator<photon> >::push_back()’
    /usr/include/c++/4.1.3/bits/stl_vector.h:602: note: candidates are: void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = photon, _Alloc = std::allocator<photon>]
    faisceau.h:20: error: expected `;' before ‘:’ token
    faisceau.h:21: error: ‘((faisceau*)this)->faisceau::tab_photon.std::vector<_Tp, _Alloc>::back [with _Tp = photon, _Alloc = std::allocator<photon>]’ does not have class type
    faisceau.h:22: error: ‘calculePonderation’ was not declared in this scope
    faisceau.h: At global scope:
    faisceau.h:24: error: variable or field ‘affichefaisceau’ declared void
    faisceau.h:24: error: missing template arguments before ‘vector_a_afficher’
    faisceau.h:25: error: expected ‘,’ or ‘;’ before ‘{’ token
    main.cpp: In function ‘int main()’:
    main.cpp:12: error: variable ‘std::ifstream ifs’ has initializer but incomplete type
    faisceau.h:14: error: ‘std::vector<photon, std::allocator<photon> > faisceau::tab_photon’ is private
    main.cpp:18: error: within this context
    main.cpp:18: error: ‘affichefaisceau’ cannot be used as a function

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    L'erreur est dans : tab_photon.push_back():ponderation(0);

    Je ne sais pas trop ce que tu espères que cette fonction fasse... Si tu veux ajouter ponderation(0) dans le tableau, il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tab_photon.push_back(ponderation(0));
    Le message d'erreur te dis qu'il existe bien une fonction push_back dans vector, mais qu'elle attend un paramètre du type d'élément à mettre dans le vecteur.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  19. #19
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2008
    Messages : 16
    Par défaut
    merci jolyloic de ta réponse, ca fesait un moment que j'attendais.
    En fait, je voulais juste ajouter un élément vide à la fin du vecteur, mais peut être que c'est pas autorisé ?
    Alors, j'ai changé en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void faisceau::initialise(long long tps)
            { 
                photon photon_lu;
                photon_lu.tps_arrive = tps;
                photon_lu.ponderation = 0;
                tab_photon.push_back(photon_lu);
                calculePonderation();
            }
    Effectivement les erreurs se sont réduites, mais toujours le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    faisceau.h:12: error: ‘vector’ is not a type
    voilà les erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    faisceau.h:12: error: ‘vector’ is not a type
    faisceau.h: In member function ‘void faisceau::initialise(long long int)’:
    faisceau.h:21: error: aggregate ‘photon photon_lu’ has incomplete type and cannot be defined
    faisceau.h:25: error: ‘calculePonderation’ was not declared in this scope
    faisceau.h: At global scope:
    faisceau.h:27: error: variable or field ‘affichefaisceau’ declared void
    faisceau.h:27: error: ‘int faisceau::affichefaisceau’ is not a static member of ‘class faisceau’
    faisceau.h:27: error: missing template arguments before ‘vector_a_afficher’
    faisceau.h:28: error: expected ‘,’ or ‘;’ before ‘{’ token
    main.cpp: In function ‘int main()’:
    main.cpp:13: error: variable ‘std::ifstream ifs’ has initializer but incomplete type
    faisceau.h:14: error: ‘std::vector<photon, std::allocator<photon> > faisceau::tab_photon’ is private
    main.cpp:19: error: within this context
    main.cpp:19: error: ‘affichefaisceau’ was not declared in this scope

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Adnanius Voir le message
    En fait, je voulais juste ajouter un élément vide à la fin du vecteur, mais peut être que c'est pas autorisé ?
    Un vecteur, comme un tableau à la C, contient des éléments typés. Ici, tu veux manipuler un vecteur de photons, et il ne peut contenir que des photons. Il n'y a pas de notion de case vide.

    Citation Envoyé par Adnanius Voir le message
    Effectivement les erreurs se sont réduites, mais toujours le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    faisceau.h:12: error: ‘vector’ is not a type
    Effectivement, j'ai swappé ce problème...

    vector n'est pas un type en effet. Ce qui est un type, c'est un vecteur de Photon, un vecteur d'entiers, un vecteur de chaînes... Un tel type s'écrit par exemple :
    Tu l'as bien écrit pour ta variable membre, mais pas pour ton argument de fonction. C'est comme si tu voulais déclarer un tableau à la C et que tu écrivais :
    Au lieu de
    Enfin, petit détail, affichefaisceau prend son paramètre par copie. Ce qui peut être mauvais pour un vecteur qui s'il est gros peut mettre du temps à se copier. Il vaut mieux le passer par référence constante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affichefaisceau(vector<Photon> const &vector_a_afficher);
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 8
    Dernier message: 28/02/2012, 17h44
  2. Utilisation de fstream
    Par luffy64 dans le forum Débuter
    Réponses: 3
    Dernier message: 02/02/2010, 11h28
  3. [Fichier] Problemes dans l'utilisation de fstream
    Par Kerwando dans le forum SL & STL
    Réponses: 14
    Dernier message: 09/08/2007, 01h14
  4. Utilisation de fstream dans une fonction
    Par Silverstone dans le forum SL & STL
    Réponses: 7
    Dernier message: 22/07/2006, 09h55
  5. Utilisation de <fstream>
    Par SebRs dans le forum SL & STL
    Réponses: 3
    Dernier message: 30/03/2006, 16h46

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