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 ne lit pas tous les formats?


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut ifstream ne lit pas tous les formats?
    Bonjour,

    J'ai un fichier de type texte(je crois). Je m'explique j'arrive a l'ouvrir avec NotePad et les editeurs de fichiers sources sans probleme, je l'affiche et le lit pas de probleme de caractere ou de saut a la ligne.

    Mais avec ifstream je n'arrive pas a le lire?! en faisant ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream file("test.txt");
    string line;
    if(file)
    {
    while(getline(file, line))
    cout << line;
    }
    Aucun probleme ni a la compil ni a l'execution, mais il m'affiche rien quelque retour a la ligne et c'est tout(le fichier contient bien du texte).

    Thx

  2. #2
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Novembre 2006
    Messages : 16
    Par défaut
    Ta condition n'est pas bonne, file est un objet de la classe ifstream, tu doit donc faire:

    is_open ne prend aucun argument et retourne un booléen. Sa devrait fonctionner maintenant.

    Cependant ton while ne fonctionnera pas non plus. Comme file est un objet tu doit faire file.getline(). Voici le prototype de getline:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    istream& getline (char* s, streamsize n );
    Donc file.getline(char* Ton tableau, streamsize la longeur). Voici un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    char buffer[256];
     
    ifstream file("test.txt");
     
    if(file.is_open())
    {
        file.getline(buffer, 256);
    }
    Comme tu veut lire dans un string, ton appel de getline devrait plutot ressembler à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    file.getline(line.c_str(), 256);
    Voila

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par blackshadow153 Voir le message
    Ta condition n'est pas bonne, file est un objet de la classe ifstream, tu doit donc faire:

    is_open ne prend aucun argument et retourne un booléen. Sa devrait fonctionner maintenant.
    C'est faux, ce test est tout à fait légitime : http://cpp.developpez.com/faq/cpp/?p...IERS_test_open

    Cependant ton while ne fonctionnera pas non plus. Comme file est un objet tu doit faire file.getline().
    C'est encore faux, il faut préférer std::getline à la méthode membre de l'ifstream pour ces raisons : http://cpp.developpez.com/faq/cpp/?p...ture_par_ligne

    Pour ton problème, déjà c'est étrange qu'il affiche des retours à la ligne, car std::getline les vire automatiquement avant mettre dans la string, et tu ne fais pas de std::endl...

    As-tu vérifié que le fichier lu était le bon ? (entre une adresse absolue sur ton disque C:\\... pour vérifier)

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    oupss bien vu NiamorH, effectivement dans mon code j'ai bien le "<< endl;" en plus. J'ai copie trop vite.

    Et sinon concernant le fichier ouaip il lit bien le bon.
    Le truc c'est que je le lit avec n'importe quel editeur mais pas avec ifstream...

    PS: je suis aussi parti de la FAQ pour faire mon code

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Tu pourrai donner ton fichier txt?

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Voici,

    Donc, c'est une partie du fichier mais chez moi ce fichier que je met ne marche pas je ne vois que les saut de ligne.
    C'est un fichier xml, on me le donne mais je ne sais pas du tout comment c'est genere, via un prog mais je sais pas comment.

    Et mon code mot pour mot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ifstream file("file.xml");
    string line;
    if(file)
    {
    while(getline(file, line))
    cout << line << endl;
    }
    Fichiers attachés Fichiers attachés

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    début de ton fichier en hex :
    "FF FE 3C 00 3F 00..."

    FF FE = format UTF-16
    http://en.wikipedia.org/wiki/Byte_Order_Mark
    c'est donc un fichier avec 16 bit par caractère et non 8.

    Avec quoi compile tu?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Visual C++ 6.0, console application

    ah donc en fait mes caractere sont stocke sur 2 octet...
    Mais comment je peux faire pour que ca marche dans tout les cas?

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par kacedda Voir le message
    Visual C++ 6.0, console application

    ah donc en fait mes caractere sont stocke sur 2 octet...
    Mais comment je peux faire pour que ca marche dans tout les cas?
    CHerche UTF 16 ou unicode. Tu devrait trouver des info. Je ne m'y connaît pas trop, mais y as déjà des posts dessus.
    Normalement il y as des équivalents pour les caractère 16 bits :
    ifstrem <-> wifstream
    cout <-> wcout
    endl <-> wendl
    ...
    mais ça dépend des compilot.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Ben déjà merci pour l'info, c'est cool au moins maintenant je sais pourquoi.

    Je vais regarder sur le net, mais deja en regardant la doc de ifstream, il ne m'a pas semble voir quelque chose qui me permette de connaitre l'encodage.
    Comment pourrais-je connaitre le type d'encodage du fichier? Les fichiers code en 16bit commence toujours par FF-FE?

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    oki, thanx for all
    m'en vais surfer

  13. #13
    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
    ou FE-FF en Big Endian ...

  14. #14
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Un conseil, vas télécharger Notepad++

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Un conseil, vas télécharger Notepad++
    Pour quoi faire??

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Pour quoi faire??
    +1

  17. #17
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    C'est l'outil gratuit le plus simple, puissant et rapide que je connaisse pour examiner un fichier.

    En un raccourci clavier, tu bascule du texte à l'hexa, voir binaire ou octal, avec regroupement 8,16, 32 ou 64 bits. Rien que pour cette fonction il vaut le coup.

    Tu aurais vu de suite quel souci avait ton fichier grâce au dump à droite, tous les caractères sont espacé d'un '\0'.

    Comme je manipule souvent des fichiers de données brutes, j'aurais du mal à m'en passer.

  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 : 51
    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
    Pour faire tes E/S en utf16, il faut modifier le codecvt de la locale de ton stream. Si je parle chinois pour toi, peut-être que ce sera plus clair ou . Code non testé (je n'ai pas retrouvé la page du code que j'utilise vraiment).
    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 éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    ok NiamorH, merci pour l'info.
    JolyLoic: j'ai parcouru tes liens, apparament c'est du good
    Parce que je voulai faire un truc assez generaliste donc independamment du type de codage.

    Gracias hombre!

  20. #20
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    CHerche UTF 16 ou unicode. Tu devrait trouver des info. Je ne m'y connaît pas trop, mais y as déjà des posts dessus.
    Normalement il y as des équivalents pour les caractère 16 bits :
    ifstrem <-> wifstream
    cout <-> wcout
    endl <-> wendl
    ...
    mais ça dépend des compilot.
    Le plus souvent, ça dépends de la norme, pas du compilateur

    wcout, wistream, etc sont définis dans la norme C++ - si le compilateur ne les supporte pas, autant changer de compilateur - (on est en 2008 quand même! la norme a 10 ans )

    (a noter qu'il n'y a pas de std::wendl. std::endl ajoute os.widen('\n') au flux. Si os est un flux unicode, l'appel à widen() va transformer \n en \n\0).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. [MySQL] Requete en Php: Ne lit pas tous les enregistrements d'une table
    Par smooncef dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 08/08/2008, 10h16
  3. Réponses: 2
    Dernier message: 25/09/2006, 13h04
  4. Les Langages ne sont pas tous les mêmes ......
    Par Max Payne dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 28/08/2003, 13h51

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