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

MFC Discussion :

Lecture ligne par ligne d'un fichier texte avec separateur


Sujet :

MFC

  1. #1
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut Lecture ligne par ligne d'un fichier texte avec separateur
    Salut,

    je me propose de lire un fichier texxte et stocker son contenu dans une classe qu a exactement la meme structure du fichier:
    le fichier est constitué d'un ensemble de lignes et il est constitué comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    numero;code1;code2;nom1;nom2 
    numero;code1;code2;nom1;nom2 
    ....
    donc 5 champs seront obligatoirement presents dans chaque ligne

    tous les champs sont séparés dons par un ";" et je desire les extraire et les injecter dans les attributs respectifs de ma classe !!

    comment faire au juste pour filtrer la lecture des champs selon le separateur ";" et traiter toutes les lignes?

    merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En C, tu ouvres ton fichier texte en lecture (fopen("toto.txt", "r")), tu le lis avec fgets, et tu utilises par exemple strotk pour séparer les divers champs.
    Il y a peut-être des méthodes C++ pour faire ça.

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    ça peut etre réalisé de cette maniere:

    ce code utilise ce post de la faq:
    http://c.developpez.com/faq/vc/?page...ons#MakeStrtok
    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
    18
    19
    20
    21
    22
    23
    24
     
    CStdioFile File;
    if( !file.Open("bidon.txt", CFile::modeNoTruncate   
    | CFile::modeRead | CFile::typeText ) )
    {
       #ifdef _DEBUG
       afxDump << "erreur d'ouverture fichier" << "\n";
       #endif   
    }
    File.SeekToBegin();
    CString str;
    while(file.ReadString(str))   
    {            
        bool bEndParse;
       CString strField =CStringTok(str,";",bEndParse);
       while(!bEndParse)
       {
          // Work
          // ton traitement 
          afxDump <<"\nChamp:"<< "\"" <<strFied << "\""; 
          // Get Next Token
          strField = CStringTok(NULL,";",bEndParse);
       }
    }

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3

  5. #5
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    merci farscape d'etre toujours la ...
    cependant j'ai une question... ton bout de code est capable de me lire toutes lignes de mon fichier texte et d'extraitre tous les champs meme s'ils sont vides :

    champ1;;champ2;champ4;


    merci

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    reponse oui .

  7. #7
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    juste une petite question ecore cher ami ...

    dans la partie traitement et comme je l'ai deja dit: je dois recuperer chaque champ different dans une variable a part ( qui est un attribut d'uen classe que je vais instancier au devut bien sur ) ...mais comment assuerer que chaque attribut aura le bon contenu avec ton code car je constate que tu utilise une seule variable pour y stocker le contenu cequi empeche dans mon cas de distinguer ce que ej vais affecter respectivement a chaque attribut!!!

    voilà ma classe exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    class card
     
    {
       public:
       string champ1;
      ....
       string champ5 ;
     
    }

    comment assuerer l'affectation respective sachant que chaque ligne parsée correpondera à une classe card...donc si el ficheir contient 10 lignes j'aurais en sortie une liste de classe card de dimension 10


    helpppp please
    et encore 1000 merci

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    et bien plutot que de mettre des champ1 a champ5 je mettrais un vector<string> et je ferais:
    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
    18
    19
    20
    21
     
    class card
     
    {
       public:
      std::vector<string> m_arChamps;
    };
    // et donc:
     
    bool bEndParse;
       CString strField =CStringTok(str,";",bEndParse);
       card OneCard;
       while(!bEndParse)
       {
          // Work
          // ton traitement
         OneCard.m_arChamps.push_back(static_cast<const char *>(strField));
          // Get Next Token
          strField = CStringTok(NULL,";",bEndParse);
       } 
       MyLigs.push_back(OneCard);
    ou sinon
    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
    18
    19
    20
     
    bool bEndParse;
       CString strField =CStringTok(str,";",bEndParse);
       card OneCard;
       int ct=0;
       while(!bEndParse)
       {
          // Work
          // ton traitement
         switch(ct)
         {  
            case 0:OneCar.champ1=static_cast<const char *>(strField);
                      break;
    //.....etc
         }
         ct++;
          // Get Next Token
          strField = CStringTok(NULL,";",bEndParse);
       } 
       MyLigs.push_back(OneCard);

  9. #9
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    oui ca se pourrait bien c'est uen bonne solution ...mais que ferais tu si l'un des champs a stocker dans la classe est un int ...je veux dire que tous les champs ne sont plus tous des strings ...la ta solution de vector n'est plus valable je pense non !!

    merci encore !

  10. #10
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    tu peux bien stocker des entiers,float sous forme de chaine ....
    la transformation dans le type desiré peut etre fait au moment de l'exploitation de la cellule ..

  11. #11
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    oui tu as raison j'ai oublié ca ...mais comment je peux transformer un CString en un int a stocker dans la classe!! ja fonction strtod lme parait un peu complexe !

  12. #12
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323

  13. #13
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    comment faire pour affecter donc un CString à un int ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    int a ;
    CString b ;
     
    a = strtod(b,  "\0" ) ;
    est ce la bonen methode?

  14. #14
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    nan ! ,strtod c'est d pour decimales pour un entier c'est strtol l pour long
    voir ce post:
    http://www.developpez.net/forums/vie...579898#2579898

  15. #15
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    j'ai lu ta suggestion farscape et je te remercie encore ...
    au fait la chaien que je lis est de type string et pas CString ( je en veux pas modifier le type entre nous ) donc comment selon toi je peux y remedier !! en plus sur l'exempel pourquoi trouve t on un "10" comme 3 meme parametre pour strtol ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    str.TrimRight(); 
     
       char *stopstring=NULL; 
       long l = strtol( str, &stopstring, 10 );  // ce 10 là :)
    merci

  16. #16
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    c'est la base :octal ,decimal ,hexa ,binaire ,donc 10 c'est notre systeme décimal...

  17. #17
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    alors pas de reponse ..!

  18. #18
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    Citation Envoyé par jlassira
    alors pas de reponse ..!
    il me semble avoir répondu pourtant

  19. #19
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    oui merci j'ai compris ....

  20. #20
    Membre du Club Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    Points : 61
    Points
    61
    Par défaut
    resalut

    comme suite a l'ecriture dans les fichiers...j'ai elaboré le code suivant :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    void CFileManager::GenerateAlphaVerifLog()
     {
     
    	 // tentative d'ouverture du fichier alphalog
    	 CCardList *m_CCardList = CCardList::GetInstance(); 
    	 CVCAConfig *m_VcaConfig = CVCAConfig::GetInstance();
          string str;
     
    	 ofstream file (m_VcaConfig->getVerifalphalogPath().c_str(), ios_base::trunc );
        if ( !file )
        {
            AfxMessageBox("Acces File Problem");
             return;
        }
     
    	else
    	{
     
    	for ( int i = 0 ; i< m_CCardList->CurrentCardList.GetSize() ; i++)
    	 {    
     
    		 CCard m_CCard =  m_CCardList->CurrentCardList.GetAt(i);
    		 file << m_CCard.getFBC() << ";"<< m_CCard.getflag_rejet() << ";" << m_CCard.getnum_cedula() ;
     
    		 if( (m_CCard.getflag_rejet() == 11 ) || (m_CCard.getflag_rejet() == 10)   )
    		 {
    		 file << ";" ;
    		 file << m_CCard.getap1()<< ";" ;
    		 file << m_CCard.getap2()<< ";" ;
    		 file << m_CCard.getnom1()<< ";" ;
    		 file << m_CCard.getnom2()<< ";" ;
    		 file << m_CCard.getfecha_neciemento()<< ";"  ;
             file << m_CCard.getobjecion() << ";" ;
    		 file << m_CCard.getletra() << ";" ;
    		 file << m_CCard.getflag_rejet() ;
     
    		 }
     
               file << "\n" ;
     
    	 }
    	}
     
       }
    la generation se fait sans probleme et meme l'ecriture dans el fichier ...MAIS le fichier n'est pas ecrasé a chaque invocation !! je veux dire que "ios_base::trunc" ne marche pas du tout chez moi !! et au lieu d'ecraser el contenu du fichier le nouveau conteneu y est ajouté !!!

    pourquoi ?

    merci de bien vouloir me repondre

Discussions similaires

  1. lecture ligne par ligne d'un fichier texte
    Par toutounesan dans le forum VB.NET
    Réponses: 4
    Dernier message: 16/06/2011, 18h28
  2. Réponses: 2
    Dernier message: 26/04/2011, 19h23
  3. Réponses: 3
    Dernier message: 07/04/2011, 09h06
  4. Réponses: 8
    Dernier message: 18/07/2010, 21h16
  5. Import fichier texte avec separateur milliers "."
    Par mgrsys dans le forum Access
    Réponses: 8
    Dernier message: 12/09/2006, 08h58

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