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 :

problème lors de la lecture d'un fichier


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut problème lors de la lecture d'un fichier
    Bonjour,

    je souhaite me faire une fonction "read" qui lit un fichier texte et qui stocke chaque ligne dans un std::vector<std::string>.

    Voici mon code

    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
     
    bool read(const string & filename, vector<string> & data)
    {
    	data.clear();
    	string line;
     
    	std::ifstream fid(filename.c_str());
    	if(!fid)
    		return false;
     
    	while(std::getline(fid, line))
    		data.push_back(line);
     
    	fid.close();
     
    	return true;
    }
    Maintenant je teste la fonction. Le fichier texte contient les 7 lignes suivantes

    toto
    tata
    tutu
    titi
    toto
    tutu
    tete
    et mon code source est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    string rep = "Fichiers/";
    string filename = rep + "testPourFonctionsReadWrite_1.txt";
    vector<string> data;
     
    read(filename, data);
    cout << "data.size() = " << data.size() << endl;
    et là j'ai data.size() == 1 et data[0] = "tototatatututititototututete"

    Quelqu'un aurait-il une idée pour m'expliquer la raison pour laquelle data.size() != 7 ?

    Merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    C'est quoi, le contenu de line, après ton getline() ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    tototatatututititototututete

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Bon, ben getline() ne détecte pas ton saut de ligne.

    Essaye d'explicitement indiquer le délimiteur, avec '\n' et "\n\r".

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    salut

    j'avais déjà essayé avec le \n et j'avais toujours le même résultat

    avec le \r ça fonctionne

    merci

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Tu es sous Windows ou Linux ?

    Si Windows, utilises-tu Visual C++ ou g++ ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    je suis sous windows et j'utilise visual studio 2005

    sous windows j'ai mis le '\r' et j'ai fais '\n' si je suis sous linux

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je suis étonné que Visual n'utilise pas par défaut "\n\r".
    Et que la norme impose en dur "\n"...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    en fait ça ne marche pas.

    Pour mon fichier texte, je dois mettre '\r' comme 3e argument du getline.
    Maintenant, si je lis un fichier csv, je ne dois rien mettre pour qu'il soit bien lu. Si je mets '\r' tout le fichier est lu en 1 ligne (data.size() == 1). Mais si je mets '\n', il est bien lu (5978 lignes)

    J'avoue ne pas tout bien comprendre...

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ca dépend comment a été enregistré ton fichier.
    Notamment s'il a été enregistré sous Windows ou Linux.

  11. #11
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Eh...les fins de ligne sont codées différemment en fonction des OS. Mais certains logiciels font leur propre choix en dur...
    Peut-être que tu devrais normaliser les fichiers avant de les relire...

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    je comprends l'origine du \n et du \r

    mais comment faire pour faire comprendre à std::getline() de prendre en 3e argument \n et \r ainsi je pourrais prendre en compte tous les types de fichiers, quelque soit les OS.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Je ne m'y connais pas trop en flux.

    Sinon, tu peux lire avec "\n".
    Si tu n'as qu'un seul élément dans ton vecteur, tu peux tenter de remplacer les "\n\r" par des "\n" et refaire des getline sur le nouveau flux...

  14. #14
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    je me demande s'il n'y a pas moyen d'avoir en lib les fonctions utilisées par dos2unix et unix2dos (les utilitaires unix qui normalisent les fin de lignes)? Ou repomper leur algo qui ne doit pas être sorcier.

  15. #15
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Le problème, c'est qu'il semble qu'il n'y ait pas de connaissance a priori du type de saut de ligne.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je ne m'y connais pas trop en flux.

    Sinon, tu peux lire avec "\n".
    Si tu n'as qu'un seul élément dans ton vecteur, tu peux tenter de remplacer les "\n\r" par des "\n" et refaire des getline sur le nouveau flux...
    je vais essayer cette solution. Je pense que c'est une très bonne idée

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Cette solution fonctionne très bien.

    Merci beaucoup !

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

Discussions similaires

  1. Problème de split lors d'une lecture d'un fichier csv
    Par Mawinette dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2009, 11h48
  2. Problème lors de la lecture d'un fichier
    Par _SamSoft_ dans le forum C
    Réponses: 2
    Dernier message: 23/02/2008, 15h14
  3. Problème lors de la lecture d'un fichier xml avec XMLBeans
    Par oscar78 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 07/09/2007, 14h04
  4. Problèmes lors de la lecture d'un fichier
    Par samothtronicien dans le forum C++
    Réponses: 5
    Dernier message: 27/05/2006, 00h05
  5. Problème lors de la lecture d'un fichier avec Input...
    Par Kronoob dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 18/11/2005, 18h55

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