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 confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    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.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas �tre meilleur que les autres, il faut �tre meilleur que soi." Albert Jacquard
    "Ceux qui savent o� ils ont pos� leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, �a vous changera les id�es !
    Ma page Prolog
    Mes codes sources comment�s

    Mon avatar : La Madeleine � la veilleuse de Georges de La Tour

  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
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3

  5. #5
    Membre confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    Par d�faut
    reponse oui .

  7. #7
    Membre confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    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 confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    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 confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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

  13. #13
    Membre confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    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 confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    Par d�faut
    c'est la base :octal ,decimal ,hexa ,binaire ,donc 10 c'est notre systeme d�cimal...

  17. #17
    Membre confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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
    Par d�faut
    Citation Envoy� par jlassira
    alors pas de reponse ..!
    il me semble avoir r�pondu pourtant

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

  20. #20
    Membre confirm� Avatar de jlassira
    Inscrit en
    Mai 2005
    Messages
    228
    D�tails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 228
    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