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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

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