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 :

ifstream operateur >> ne fonctionne pas


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 183
    Points
    5 183
    Par défaut ifstream operateur >> ne fonctionne pas
    Bonjour,

    Est-ce que quelqu'un pourrait me dire pourquoi ce code ne fonctionne pas ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::ifstream ficInTest("data.dat", std::ios_base::in | std::ios_base::binary);
     
    unsigned long nTest;
    ficInTest >> nTest;
    Le fichier est bien ouvert mais la donnée n'est pas lue
    avec la méthode read ça fonctionne
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::ifstream ficInTest("data.dat", std::ios_base::in | std::ios_base::binary);
    Il me semble que l'opérateur >> est réservé pour la lecture de texte formaté. Pour lire du texte brut, voire du binaire il faut utiliser read.

  3. #3
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 183
    Points
    5 183
    Par défaut
    C'est bien ce que je pensais, bien que je trouve cela étrange de ne pas avoir implémenté ces opérateurs pour du binaire.

    Merci pour ta réponse
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 671
    Points
    30 671
    Par défaut
    Salut, désolé de faire remonter le poste, mais
    Citation Envoyé par shenron666 Voir le message
    C'est bien ce que je pensais, bien que je trouve cela étrange de ne pas avoir implémenté ces opérateurs pour du binaire.
    Non, c'est tout à fait normal: il est strictement impossible de formater une succession de 1 et de 0 sur laquelle nous n'avons strictement aucune emprise

    Finalement, lorsque tu ouvre ton fichier en mode "binaire" (bien que le terme soit particulièrement mal choisi ), il n'y a strictement rien qui t'empêche de lire les bytes d'un entier ou d'un réel "caractères par caractères" (dont certains auront des valeurs non graphiques) ou l'inverse (de lire quatre caractères d'un coup dans un entier, par exemple)...

    Evidemment, il faut comprendre le "rien ne t'empêche" dans le sens où la tu n'a aucun moyen de faire la différence dans ton fichier entre ce qui est un byte destiné à un caractère et ce qui en est un destiné à un entier... Il est clair que, pour l'utilisation de la donnée lue, il est largement préférable de la lire dans le type adéquat
    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
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 183
    Points
    5 183
    Par défaut
    rien n'empêcherait non plus d'avoir un opérateur pour simplement lire/écrire les différents types binaires en série (sbyte, ubyte, sshort, ushort, slong, ulong, ect...) sans formatage, vu que le fichier est ouvert en mode binaire

    pour lire 10 <T> on est "obligé" de faire 10 appels de stream.read((cast T)&var, sizeof(T))
    je trouve pas ça très propre ni très c++

    je trouve dommage que ça n'ai pas été implémenté, ou alors ça l'est et j'aimerai bien trouver
    peut-etre dans boost ?

    j'ai pas trop eu le temps de chercher, je suis occupé avec boost::iostreams et les archives zip
    si quelqu'un a une proposition je suis preneur, sinon je chercherai dès que j'ai un moment
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 625
    Points : 30 671
    Points
    30 671
    Par défaut
    Mais le terme important dans "opérateur d'entrée (de sortie) formatée" est, justement... formaté

    Or le formatage ne trouve sa raison d'être que lorsque tu travailles au minimum avec "autre chose qu'une succession sans queue ni tête de 1 et de 0"...

    Or, comme je l'ai mal exprimé plus haut, tu ne peux pas considérer les informations qui se trouvent à l'intérieur d'un fichier binaire autrement que comme une succession de 1 et de 0...

    En effet, imagine un instant une structure "toute simple" proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct S
    {
        int i;
        char c;
        double f;
    };
    qui, chez moi, correspond à une structure de 16 bytes, et qui, du fait des contraintes d'alignement mémoire se présente en mémoire sous la forme de
    • 4 bytes pour i
    • 1 byte pour c
    • 3 bytes "inutilisés" (d'alignement)
    • 8 bytes pour d

    Dans un fichier binaire, tu peux, au choix te retrouver soit avec N*16 bytes (d'avoir écrit les trois bits inutilisés), soit avec seulement N*13 bytes.

    Tant que tu accédera au données de manière séquentielle, et pour autant que tu suive la même politique lors de la lecture que celle utilisée lors de l'écriture (enlever ou non les trois bits inutilisés), tu n'auras aucun problème: tu lira tes données une à une

    Mais si tu décide d'aller à la Xième donnée, et que, marqué pas de bol, tu te trompes dans ta formule pour calculer la position dans le fichier sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file.seekg(pos*16+1,ios_base::beg); //pas de bol, c'était pos*16 :P
    Lorsque tu va essayer de lire les données, tu va lire ton entier, ton caractère, passer trois bytes inutilisés et terminer par la lecture de ton double "comme une lettre à la poste", et il n'y aura strictement rien qui pourra te permettre de remarquer que la lecture est décalée d'un byte:
    • Pour ton entier, tu lira les trois derniers bytes de l'entier et le byte normalement dévolu au caractère
    • pour le caractère, tu lira en réalité le premier byte inutilisé
    • pour le double, tu lira les 7 derniers bytes dévolu au double et le premier byte de l'entier de la structure suivante

    Et la lecture s'effectuera de manière tout à fait correcte...

    Mais tu obtiendra des données pour le moins incohérentes

    Par contre, si tu envisage ton fichier comme un fichier texte, tu n'a pas de problème: ce que tu lis sera d'office un caractère...

    Si l'on parle d'entrée formatée pour un fichier texte, c'est entre autre du fait qu'il existe un format clairement défini pour chaque type que l'on peut rencontrer:
    • un entier est composé
      • d'un signe négatif éventuel
      • d'une succession de chiffres (caractères dont la représentation s'étend entre '0' et '9')
    • un double sera composé (s'il n'est pas écrit en notation scientifique)
      • d'un signe négatif éventuel
      • d'un certain nombre de chiffres
      • d'une virgule éventuelle
      • d'un certain nombre de chiffres après la virgule
    • La plupart des données significatives seront représentées sous la forme de caractères "affichables" (dont la valeur est supérieure ou égale à 32 si tu suis la table ASCII)
    • que les données significatives seront séparées, outre utilisation d'un symbole particulier pour respecter un format précis (CSV) par un caractère qui peut être considéré comme un espace (espace, tabulation, retour à la ligne...)
    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

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  2. [FP]Writeln ne fonctionne pas !
    Par néo333 dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 01/11/2003, 23h47
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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