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 :

lecture fichier avec cin


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut lecture fichier avec cin
    Bonjour,

    Je me permet de poser une question car je suis très débutant en C et C++.
    Voilà en fait, j'aimerais lire chaque ligne d'un fichier txt sans devoir utilisé les flots C++ car c'est un TP pour l'école et du fait qu'on a pas vu les flots, pas possible de l'utiliser.
    Il m'est demandé d'utiliser les flot d'entrée standard cin et aussi la redirection de l'entrée stardand Unix (<) pour envoyer les données du fichier à votre programme.

    J'ai parcouru beaucoup de forum, mais beaucoup utilise les getline etc...ce que je dois pas faire...Mais qui doit être plus pratique.

    Quelqu'un pourrait m'éclairer un peu s'il vous plait?

    Cordialement.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il m'est demandé d'utiliser les flot d'entrée standard cin et aussi la redirection de l'entrée stardand Unix (<) pour envoyer les données du fichier à votre programme.
    Donc tu fais dans un premier temps le programme (test) suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        char s[256];
     
        cin.getline(s, sizeof(s));
        cout << s << endl;
     
        return 0;
    }
    Pour le lancer et le demander d'utiliser le fichier entree.txt (qui doit être organisé en lignes, c'est-à-dire suite de caractères + une fin de ligne (ENTREE)) comme entrée standard (c'est-à-dire le fichier depuis lequel cin va lire les données ...), tu tapes :
    Et je me demande bien qu'est-ce que t'as contre getline vu que c'est la solution la plus simple mise à ta disposition ...

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par Melem Voir le message
    Et je me demande bien qu'est-ce que t'as contre getline vu que c'est la solution la plus simple mise à ta disposition ...
    Ca doit être dans l'énoncé de son exo à mon avis.

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Melem Voir le message
    Donc tu fais dans un premier temps le programme (test) suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        char s[256];
     
        cin.getline(s, sizeof(s));
        cout << s << endl;
     
        return 0;
    }
    Pour le lancer et le demander d'utiliser le fichier entree.txt (qui doit être organisé en lignes, c'est-à-dire suite de caractères + une fin de ligne (ENTREE)) comme entrée standard (c'est-à-dire le fichier depuis lequel cin va lire les données ...), tu tapes :
    Et je me demande bien qu'est-ce que t'as contre getline vu que c'est la solution la plus simple mise à ta disposition ...
    Apparemment il a même pas le droits d'utiliser getline...

  5. #5
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    J'utiliserai la fonction fread(), mais c'est emprunté au C

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Goten
    Apparemment il a même pas le droits d'utiliser getline ...
    Alors changer de langage (le C me semble bien ).

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Melem Voir le message
    Et je me demande bien qu'est-ce que t'as contre getline vu que c'est la solution la plus simple mise à ta disposition ...
    Merci beaucoup...
    J'ai rien contre les getline, c'est juste que comme on ne l'a pas vue en cours, le prof ne veut pas qu'on l'utilise.

    Question :
    Quand je vais faire ./main < fichier.txt, dans mon prog, je fais comment pour recupérer chaque élément d'une ligne de mon fichier (une ligne = suite de 4 float) ?

    En tout cas, merci beaucoup.

  8. #8
    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, et bienvenue sur le forum.

    Personnellement, j'aurais tendance à eng mon prof, s'il me donnait un exercice de ce genre...

    En effet, cela revient à demander à un maçon de construire un mur, sans lui donner ni les briques ni le ciment qui sont nécessaire à la réalisation

    Maintenant, peut être veux tu "simplement" prendre un peu d'avance sur un TD qui ne t'a pas encore été donné, et dans ce cas, tu dois pouvoir te dire que, lorsqu'il le sera, le prof t'aura indiqué comment gérer les fichiers au quel cas, c'est de ton coté que partira l'engu, pour avoir, selon le cas, présumé de ce que tu auras vu d'ici là, ou été trop impatient
    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

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Maintenant, peut être veux tu "simplement" prendre un peu d'avance sur un TD

    Lol, en aucun cas je veux prendre de l'avance...C'est énoncé clairement dans la consigne que comme on a pas encore vu en cours le getline, on devait se débrouiller avec le cin...ii

    MErci

  10. #10
    Membre chevronné Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Par défaut
    Bonjour,

    Je crois que tu peux simplement rediriger le streambuf de std::cin vers std::cout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
     
    int
    main ()
    {
      std::cout << std::cin.rdbuf();
    }

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par InfoGitan Voir le message
    J'ai rien contre les getline, c'est juste que comme on ne l'a pas vue en cours, le prof ne veut pas qu'on l'utilise.
    Pareil que Koala.
    Pour moi, un prof devrait montrer dès le début les bons outils (surtout std::string et std::getline()), puis demander de faire quelques exercices sans ou de reproduire sa fonctionalité.
    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.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par dapounet Voir le message
    Bonjour,

    Je crois que tu peux simplement rediriger le streambuf de std::cin vers std::cout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <iostream>
     
    int
    main ()
    {
      std::cout << std::cin.rdbuf();
    }
    J'ai peur que la solution soit beaucoup trop simple pour un exo
    Citation Envoyé par InfoGitan Voir le message
    Merci beaucoup...
    J'ai rien contre les getline, c'est juste que comme on ne l'a pas vue en cours, le prof ne veut pas qu'on l'utilise.

    Question :
    Quand je vais faire ./main < fichier.txt, dans mon prog, je fais comment pour recupérer chaque élément d'une ligne de mon fichier (une ligne = suite de 4 float) ?

    En tout cas, merci beaucoup.
    Est-ce que ce ne serait pas ça la clé de ton exo : lire 4 floats, puis les afficher, et ainsi de suite ? Ca me parait tellement trivial que je serais tenté de te demander : qu'avez-vous appris jusque là au juste. Sans cette information, je craint que toute réponse ne te donne la solution de ton problème sans que tu ais pu réfléchir dessus. Donc reprenons : que veux-tu faire exactement, que sais-tu, et où bloques-tu pour résoudre ton exercice ?

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Donc reprenons : que veux-tu faire exactement, que sais-tu, et où bloques-tu pour résoudre ton exercice ?
    J'ai une classe sphere avec comme attributs :
    -un centre (3coordonnées float)
    - un rayon float.

    J'ai un fichier avec sur chaque ligne ces 4 floats.
    J'aimerais pouvoir créer des objets Sphere grâce au fichier.txt mais celà sans utiliser de getline etc...Mais seulement le cin.

    Je veux pas qu'on me donne la réponse mais juste des infos sur cette technique.

    Merci de votre aide.

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    voilà l'énoncé comme ça, ça sera peut être plus clair pour vous.

    On a rangé dans le fichier spheres.txt une description de plusieurs sphères. Chaque sphère est décrite sur une ligne par le format suivant : x y z r. Ecrire un programme qui relise chaque ligne de ce fichier, construise la sphère correspondant et affiche son contenu à l'écran. On précise les deux points suivants :

    - Dans la mesure où les flots C++ n'ont pas encore été vus, la lecture du fichier se fera par l'intermédiaire du flot d'entrée standard cin et vous utiliserez la redirection de l'entrée stardard Unix (<) pour envoyer les données du fichier à votre programme.
    - Le programme s'arrêtera lorsque le rayon lu sera négatif ou nul.

    En espérant que ça vous éclair un peu plus sur mon problème.

    Encore merci

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Qu'est supposé être le "contenu" d'une sphère ?
    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.

  16. #16
    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
    La solution va passer par une boucle récupérant les différentes valeurs dans ton fichier, afin de créer un ensemble de sphères

    L'idée, c'est que, si tu invoque ton programme sous la forme de
    tu peux récupérer un réel dans ce fichier sous la forme de
    A partir de là, il "suffit" de gérer une boucle "tant qu'il y a quelque chose à lire", et à créer tes différentes classes

    Cela pourrait prendre la forme 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
    int main()
    {
        std::vector<Sphere> tab;
        float x;
        float y;
        float z;
        float ray;
        /* y a peut etre quelque chose à faire ici :P */
        while(/* faut pas croire que je ferai tout pour toi :D */ )
        {
            /* y a peut etre quelque chose à faire ici :P */
            tab.push_back(Sphere(x,y,z,ray));
        }
        return 0;
    }
    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

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Qu'est supposé être le "contenu" d'une sphère ?
    Voici mon code de mes HPP.

    Sphere.hpp
    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
     
    #ifndef _SPHERE_HPP
    #define _SPHERE_HPP
    #include "Point3D.hpp"
     
    class Sphere{
     
    	private :
    		Point3D centre;
    		float rayon;
     
    	public :
    		Sphere();  													//constructeur par défaut
    		Sphere(float p_x, float p_y, float p_z, float p_rayon);		//Constructeur avec 3 floats du point et 1 float du rayon
    		Sphere(Point3D p_pt, float p_rayon);						//Constructeur avec un objet Point3D et le rayon
    		Sphere(const Sphere& p_sph);								//Constructeur par recopie
    		~Sphere();													//Destructeur
    		void operator=(Sphere p_sph); 								//Surcharge  de l'opérateur =	
    		void print(void);											//procédure d'affichage
    };
     
    #endif // _SPHERE_HPP
    Point3D:

    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
     
    #ifndef _POINT3D_HPP
    #define _POINT3D_HPP
     
     
    class Point3D{
     
    	private :
    		float x;
    		float y;
    		float z;
     
    	public :
    		Point3D(); 									//Constructeur par défaut
    		Point3D(float p_x, float p_y, float p_z);	//Constructeur avec 3 paramètres
    		Point3D(const Point3D& p_pt);				//Constructeur par recopie
    		~Point3D();
    		void operator=(Point3D p_pt); //Surcharge  de l'opérateur =	
    		void print(void);							//procédure d'affichage
     
    };
     
    #endif // _POINT3D_HPP
    Merci

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Pourquoi faire un constructeur par copie et une redéfinition de l'opérateur =. Si cela n'est pas demandé explicitement par ton prof, alors évite. Leur version par défaut générée par le compilo suffit amplement.
    Ensuite, Koala t'a donné un bon caneva pour finir ton travail.
    Il te reste à lire tes données depuis cin vers les float. Comment as-tu appris à le faire?
    Puis à créer (attention, créer ne veut pas forcément dire allouer dynamiquement) de nouvelle sphère et les afficher.
    Sais-tu créer un objet?
    Comment souhaites-tu l'afficher?

  19. #19
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Dis à ton prof que dans le pire des cas ça doit se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ifstream in("fichier.txt");
    float x, y, z, ray;
    in >> x >> y >> z >> ray;
    Sphere s(x,y,z,ray);
    Pour répondre exactement à l'énoncé, voir la réponse de koala01. Mais qu'est-ce que je trouve ça bête comme méthode... Enfin si tu veux des conseils sur les bonnes pratiques du C++, viens plutôt ici que vers ton prof

  20. #20
    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
    Citation Envoyé par Alp Voir le message
    Dis à ton prof que dans le pire des cas ça doit se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ifstream in("fichier.txt");
    float x, y, z, ray;
    in >> x >> y >> z >> ray;
    Sphere s(x,y,z,ray);
    Pour répondre exactement à l'énoncé, voir la réponse de koala01. Mais qu'est-ce que je trouve ça bête comme méthode... Enfin si tu veux des conseils sur les bonnes pratiques du C++, viens plutôt ici que vers ton prof
    Bah oui, mais si les profs étaient intelligents, et connaissaient (réellement) le C++, plutôt que de présenter une horrible sorte de C avec classes, cela se saurait (enfin, pour une grande partie, parce qu'il y a quelques exceptions tout de même )
    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

Discussions similaires

  1. Lecture fichier avec Working ou FD ?
    Par phdevp49 dans le forum Cobol
    Réponses: 4
    Dernier message: 27/05/2011, 14h15
  2. Problème de lecture fichier avec std::getline
    Par marcootz dans le forum C++Builder
    Réponses: 13
    Dernier message: 15/05/2008, 15h42
  3. Lecture fichier avec virgule
    Par Tyler Durden dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/04/2008, 14h21
  4. Problème lecture fichier avec >>
    Par C1rcus dans le forum C++
    Réponses: 2
    Dernier message: 18/11/2007, 18h19
  5. lecture fichier avec feof
    Par broumbroum dans le forum Langage
    Réponses: 3
    Dernier message: 28/11/2006, 16h15

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