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 :

Comment récupérer les données dans un fichier sans les séparateurs


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 61
    Points
    61
    Par défaut Comment récupérer les données dans un fichier sans les séparateurs
    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
     
    CStdioFile f2 ("C://mesures//mesures_temp.txt", CFile::modeRead | CFile::typeText );
     
     
     
    	fichier.close();
    	CString s1, s2
    	f2.ReadString(s1); // s1 contient "premiere ligne"
    	f2.ReadString(s2); // s2 contient "deuxieme ligne"
     
     
       CString strTemp=s1;
       char *pWord = strtok(strTemp.GetBuffer(0), ";");
       while( pWord != NULL )
       {
            pWord = strtok( NULL, ";" );
       }
    Je récupére les données sans séparateurs (je spécifie le séparateur),
    mais je dois savoir combien il y a de lignes dans le fichier.
    Comment faire?

  2. #2
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    est tu obligé d'utiliser les CString ??
    Attention strtok
    char *pWord = strtok(strTemp.GetBuffer(0), ";");
    strok va modifier la mémoire de strTemp. ce qui n'est pas propre, et certainement créer des problème de memoire plustard

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 61
    Points
    61
    Par défaut
    non mais je pourrais utiliser quoi d'autres?

    Pour l'insant j'ai que des mesures mais après j'aurais des chaînes de caractères aussi

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour savoir ou non s'il y a un inconvénient à employer strtok() ici, il faudrait savoir ce que tu vais de strTemp par la suite.

    Quant au comptage de ligne, ben... Une boucle de ReadString() devrait faire l'affaire, non ?
    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.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par toutounesan Voir le message
    je dois savoir combien il y a de lignes dans le fichier.
    Comment faire?
    J'ai déjà dit :
    Dans la FAQ : il y a deux méthodes. Tu vas dans la FAQ de temps en temps?
    http://cpp.developpez.com/faq/cpp/?p..._compte_lignes

  7. #7
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par toutounesan Voir le message
    non mais je pourrais utiliser quoi d'autres?

    Pour l'insant j'ai que des mesures mais après j'aurais des chaînes de caractères aussi
    Ben les std::string justement. La faq est basé sur La SL (donc plustôt portable) et non les MFC (beurk pas beau) .
    Je comprend ton problème avec la FAQ, vue que tu utilise des class windows... Si tu as le choix, utilise les string, ifstream, ofstream de la std. Qui sont bien expliqué dans la FAQ et je pense de meilleur qualité que ces les MFC

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour savoir ou non s'il y a un inconvénient à employer strtok() ici, il faudrait savoir ce que tu vais de strTemp par la suite.

    Quant au comptage de ligne, ben... Une boucle de ReadString() devrait faire l'affaire, non ?
    Vue que strtok modifie la mémoire du tableau de char* passé en paramètre. Il y as un gros inconvénient !! Même si cela plantera peut être pas, utilisé comme cela, on va modifier la mémoire d'un objet, sans qu'il en soit conscient. Ce qui n'est pas du tout propre et une grosse source de bug futur

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    EN faite y as une FAQ pour le MFC
    http://cpp.developpez.com/faq/vc/?page=sommaire
    dont cette partie :
    http://cpp.developpez.com/faq/vc/?page=Fichiers
    qui ressemble à ce que tu cherche

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 559
    Points : 61
    Points
    61
    Par défaut
    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
     
     
    CStdioFile f2 ("c:\\test.txt", CFile::modeRead | CFile::typeText );
    CString s1, s2;
    f2.ReadString(s1); // s1 contient "premiere ligne"
    f2.ReadString(s2); // s2 contient "deuxieme ligne"
    f2.Close();
     
    //----------Lecture des éléments de la 1ere ligne (les éléments séparés par ";"------------//
    CString strTemp=s1;
       char *pWord = strtok(strTemp.GetBuffer(0), ";");
       while( pWord != NULL )
       {
            pWord = strtok( NULL, ";" );
       }
    Je ne sais pas trop comment faire pour lire tous éléments de toutes les lignes

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    ca devrait être
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CStdioFile f ("c:\\test.txt", CFile::modeRead | CFile::typeText );
    CString s_ligne;
     
    //lecture ligne par ligne du fichier
    while(f2.ReadString(s_ligne) == true)
    {
    //traitement de la ligne
    }
     
    f2.Close();
    Encore une fois si tu peut eviter d'utiliser les CString et autre class de la mfc, fait le.

    Les string, ifstream de la std sont bien plus simple et propre.

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Pour le decoupage de la ligne. Il n'y as pas de methode de token avec les CString. Faut que tu le fasse a la main .
    voici un lien sur une class token pour les CString (beurk pas bô)
    http://www.codeguru.com/cpp/cpp/stri.../?thread=36906

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    Vue que strtok modifie la mémoire du tableau de char* passé en paramètre. Il y as un gros incontinent !! Même si cela plantera peut être pas, utilisé comme cela, on va modifier la mémoire d'un objet, sans qu'il en soit conscient. Ce qui n'est pas du tout propre et une grosse source de bug futur
    Avec CString::GetBuffer(), l'objet est conscient qu'on modifie ses données.
    Mais il faut faire un ReleaseBuffer() quand on a fini...
    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.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Avec CString::GetBuffer(), l'objet est conscient qu'on modifie ses données.
    Mais il faut faire un ReleaseBuffer() quand on a fini...
    ??? peut etre mais c'est pas propre

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ben si.
    C'est la façon que donne MFC pour avoir un accès en écriture sur les caractères, quand le besoin s'en fait sentir.

    Cela évite d'avoir à faire un new char[], une recopie, puis peut-être une seconde...

    Bien sûr, je dois reconnaître qu'il n'est pas courant de l'employer avec une fonction comme strtok()...
    Mais ça reste tout-à-fait valide, d'autant qu'on SAIT que strtok() n'augmentera jamais la taille de la chaîne...
    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.

  16. #16
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ben si.
    C'est la façon que donne MFC pour avoir un accès en écriture sur les caractères, quand le besoin s'en fait sentir.

    Cela évite d'avoir à faire un new char[], une recopie, puis peut-être une seconde...

    Bien sûr, je dois reconnaître qu'il n'est pas courant de l'employer avec une fonction comme strtok()...
    Mais ça reste tout-à-fait valide, d'autant qu'on SAIT que strtok() n'augmentera jamais la taille de la chaîne...
    Mouais. Je viens de trouver ça dans la FAQ http://cpp.developpez.com/faq/vc/?pa...ons#MakeStrtok

    Utiliser strtok avec CString je pense que c'est du Goret Force 7.... Du moins ca peut donner de mauvais habitude...
    mais bon c'est mon avis.

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Pour moi, utiliser strtok() quant strtok_r() est disponible est du code de goret.
    Sachant que strtok_r() n'est pas disponible sous Visual, et un équivalent n'existe que depuis la CRT 8.0 (ils l'ont appelée strtok_s()).

    Bien sûr, la bonne méthode serait de réimplémenter strtok_r() quand elle n'est pas là, mais il y a le facteur flemme qui entre en jeu.


    ...Ah, ce n'est pas de ça que tu parlais ?
    Si c'est juste parce que strtok() modifie la chaîne, je pense que tes préjugés sont injustifiés.
    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.

  18. #18
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pour moi, utiliser strtok() quant strtok_r() est disponible est du code de goret.
    Sachant que strtok_r() n'est pas disponible sous Visual, et un équivalent n'existe que depuis la CRT 8.0 (ils l'ont appelée strtok_s()).

    Bien sûr, la bonne méthode serait de réimplémenter strtok_r() quand elle n'est pas là, mais il y a le facteur flemme qui entre en jeu.


    ...Ah, ce n'est pas de ça que tu parlais ?
    Si c'est juste parce que strtok() modifie la chaîne, je pense que tes préjugés sont injustifiés.
    1- tu n'a aucune idée de comment est implémenté CString
    2- tu n'a aucune idée de comment est implémenté strtok

    Imagine qu'un jours le code interne de CString change. Et la paf plus rien ne marche...
    Tant qu'as faire, si je suis ta logique

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::string string("aze;az;r;t;y;u");
     char *pWord = strtok((char*)string.data(),";");
     
       while( pWord != NULL )
       {
            pWord = strtok( NULL, ";" );
       }
    est correct....
    Ben ça doit être l'une des pire chose à faire en C++; A mon avis

  19. #19
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    1. On se fout de l'implémentation, c'est la doc de GetBuffer()/ReleaseBuffer() qui est importante. Chez Microsoft comme chez la plupart des professionnels, si c'est documenté, ça ne doit pas changer (sauf cas de force vraiment majeure).
    2. Là, il est possible que tu marques un point. Il faudrait que je relise la spécification de strtok()...
      Edit: La doc POSIX ne dit pas explicitement que strtok() et strtok_r() ne doivent rien modifier après la chaîne. Mais si une telle fonction faisait cela, elle serait inutilisable car elle ne permet pas de spécifier la taille de buffer (comme gets()).
      Il est donc raisonnable de supposer que cette fonction ne peut modifier que l'intérieur de la chaîne, comme la fonction fclean() qu'on trouve sur ce forum.
      Tant que cette hypothèse est vérifiée, strtok() sur un buffer de CString est safe.

    GetBuffer()/ReleaseBuffer() est bien plus que std::string::data() : C'est un vrai mécanisme de verrouillage, d'où la nécessité du ReleaseBuffer().
    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.

  20. #20
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    GetBuffer()/ReleaseBuffer() est bien plus que std::string::data() : C'est un vrai mécanisme de verrouillage, d'où la nécessité du ReleaseBuffer().
    C'est donc pas propre de modifier la mémoire donné par GetBuffer()

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/12/2010, 22h04
  2. Réponses: 1
    Dernier message: 30/11/2009, 22h50
  3. Réponses: 0
    Dernier message: 10/08/2008, 19h05
  4. Réponses: 8
    Dernier message: 23/06/2006, 13h51
  5. [](VB) Récupérer les données dans un fichier .xml
    Par Furius dans le forum VBScript
    Réponses: 4
    Dernier message: 02/10/2005, 20h39

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