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

Langage C++ Discussion :

Comment fonctionne ifstream ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Comment fonctionne ifstream ?
    Salut,
    j'essaye d'écrire et de lire des données dans un fichier, en fait ici je suis entrain de tester avec un pointeur sur un objet polymorphique, j'arrive bien à écrire les entier dans le fichier et à réallouer le type réel de l'objet à la lecture, voici le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0-10001001001005050501
    la 1ère valeur est juste l'id du pointeur.
    le second paramètre est l'id du type dérivé. (je pense que je pourrai l'omettre car même sans connaître le type réel de l'objet à la lecture le type du pointeur est bien le type réel de l'objet (j'ai testé avec typeid) donc je pense que ça alloue le même espace mémoire pour chaque types. (de base et dérivés))

    Je ne pense donc pas que le problème vienne de là.

    Le problème semble venir de ifstream qui ne conserve pas la taille des types, mes entier, par exemple, si j'ai 100 comme valeur ça me lis 1, puis ça ignore les 0 et ça me relis 1, etc..., bref, il me lit pas bien les valeurs, faut t'il stocker soit même la taille des nombres et lire les chiffres un par un ?
    Bref je ne vois pas très bien comment faire et je sais pas trop comment fonctionne ifstream en mode texte lorsqu'il lis le fichier :
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator() (T& data, D...) {
            //std::cout<<std::endl;
            buffer>>data;
            std::cout<<"int : "<<data<<std::endl;
            /*std::string s;
            std::cin>>s;*/
        }

    Voilà donc merci d'avance pou vos réponses.

  2. #2
    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
    Les opérateurs >> et << employés avec les streams agissent sur du texte (et par défaut, exprime les nombres en décimal). Si ton fichier ne contient pas d'espace entre deux nombres, comment le ifstream peut-il savoir où commence un nombre et où finit l'autre?
    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.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tu es plusieurs solutions :
    • séparer tes valeurs par un caractère ;
    • stocker tes valeurs sous formes binaires et non sous forme de caractères.


    Tu peux tenter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonStream << (std::hex) << tonInt;
    Pour stocker en hexadécimal.
    Cf man hton

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tonStream.write( (char *)&tonInt, sizeof(int) )

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ok, je vais essayer ça, merci.

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai tout séparé par un espace et ça lis bien, merci.

    Mais je me pose une question, comment séparer deux string ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Trois solutions :
    • tu sépares tes valeurs pendant ta lecture avec ifstream : tu demandes un entier, puis un autre, etc. ;
    • tu lis tout d'un bloc et tu utilises std::stringstream (la lecture est donc identique à ifstream) ;
    • tu lis tout d'un bloc, tu utilises std::stringstream et tu lit avec std::getline ;

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ok je vois déjà plus claire, bref, mon fichier peut contenir aussi bien des entiers que des strings vu que ce sont des données sur des objets.
    De plus le flux peut soit être de type stringstream (flux mémoire) ou bien de type ifstream, ça dépend si je décide d'envoyer les données sur le réseau ou bien si je décide de les sauvegarder dans un fichier.

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

Discussions similaires

  1. [JSF] comment fonctionne <h:message> ?
    Par anitshka dans le forum JSF
    Réponses: 5
    Dernier message: 29/06/2005, 17h36
  2. Comment fonctionne TXmlDocumment ????
    Par almisuifre dans le forum C++Builder
    Réponses: 8
    Dernier message: 18/02/2005, 12h54
  3. comment fonctionne une interface graphique???
    Par elekis dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 27/10/2004, 23h10
  4. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 17h44
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 11h26

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