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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    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 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    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 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

  8. #8
    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 ?

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

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