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 :

fonction strtok à inserer dans un tableau


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut fonction strtok à inserer dans un tableau
    Bonjour,

    voici les informations qu'il y a dans le fichier que je dois lire :
    titi;blabla;blabla;blabla;blabla;blabla
    toto;blabla;blabla;blabla;blabla;blabla

    c'est un fichier qui est donc structuré

    voici mon code qui fonctionne très bien :

    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
     
    // j'ouvre mon fichier
    fgets(szLine, L_PRM_LINE, fp);
     
    //tant que non fin de fichier
      while(!feof(fp))
      {
    	// affiche ma ligne szLine dans mon fichier debug
       dprintf("Début de szLine : <%s>\n", szLine);	
     
       char * pch;
     
       //découpage de ma ligne
       pch = strtok (szLine,";");
     
       while (pch != NULL)
       {
        pch = strtok (NULL, ";");		
       }
        fgets(szLine, L_PRM_LINE, fp);
      }
    Résultat :
    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
     
    Début de szLine : titi;blabla;blabla;blabla;blabla;blabla
    titi
    blabla
    blabla
    blabla
    blabla
    blabla
    Début de szLine : toto;blabla;blabla;blabla;blabla;blabla
    toto
    blabla
    blabla
    blabla
    blabla
    blabla
    j'aimerai insérer ses valeurs dans des cellules d'un tableau, et je ne vois pas comment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    A1:titi A2:blalbla A3:blabla...
    B1:toto B2:blabla B3:blabla...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    tu as déjà l'algo, il te manque plus que les index lignes/colonnes.
    Un peu de bon sens maintenant .

    - Tes index démarrent chacun à 0 (ou 1)
    - tu incrémentes la colonne quand tu rencontres un ;
    - tu incrémentes la ligne quand tu arrives en fin de ligne et tu réinitialises la colonne à 0 (ou 1)
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Par défaut
    Un "tableau" ça n'existe pas nativement en C++.

    Par contre un tableur du genre Excel (ou équivalent OOo) saura importer ton fichier pour te l'afficher graphiquement dans un tableau.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    Merci, je vais essayer, je ne suis pas très caler en tableau je vais voir la faq pour voir comment faire un tableau

  5. #5
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    dites moi si je me trompe, mais la fonction strTok découpe une chaine de caractère jusqu'au point délimiteur qui est ici le ";".
    Cette fonction me "l'affiche" en vrac. Moi j'ai besoin de récupérer ses informations dans des variables pour faire des traitements par la suite. Pour moi je ne voyais que des cellules de tableau, mais il y a peu être plus simple, mais je ne vois pas quoi...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    strtok modifie la chaîne.
    Elle remplace le premier token trouvé par un caractère de fin de chaîne, ce qui a pour conséquence de faire croire qu'on l'a découpé, mais en réalité on l'a altérée pour l'afficher.

    C'est aussi une vieille fonction C, et nous sommes en C++.
    Utiliser des std::string, stringstream, utiliser des méthodes de découpe ou parser la chaîne caractère par caractère.

    Quant à l'affichage, c'est purement esthétique et personnel, ton choix n'engage que toi.
    Que tu affiches un tableau (enfin... ce que tu appelles un tableau est je suppose le fichier ouvert sous excel), une liste, dans un fichier, une console, ... n'y changera strictement rien si l'algo initial est correct.
    Et strtok n'a rien à voir avec l'affichage.

    http://en.cppreference.com/w/c/string/byte/strtok
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    alors moi je me base sur ce site la pour les fonctions : http://www.cplusplus.com/reference/clibrary/cstring/

    Parce que je suis entrain de faire du développement sur une application mobile qui à pour OS windows C.E... et je développe sur un outil qui est embedded visual c++ (sans débeugger c'est pour cela qu'il y a des dprintf un peu partout pour alimenter mon fichier de bug)oui c'est vieux... et je suis obligé d'utiliser MFC d'ou le strtok.

  8. #8
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    je suis arrivé partiellement. J'arrive bien à stocker mes valeurs de ma fonction strTok dans un "tableau" grâce à strcpy.
    Mais maintenant je veux récupérer cette valeur et l'affecter à une variable de type CString ou char.
    Le truc c'est que mon "tableau" à un type *Char et évidement pas compatible avec ma variable de type CString ou char.

    Comment faire ?

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Je n'ai absolument rien compris.

    Si ton problème c'est la définition du tableau, il pourrait être intéressant de fournir cette déclaration, ainsi qu'un peu de code d'utilisation..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2009
    Messages : 15
    Par défaut
    Lorsque tu récupères la valeur que tu aimerais stocker dans ton tableau de char*, tu devrais pouvoir t'en sortir avec une fonction strcpy.

    Le problème étant que tu dois avoir un char* pour faire ta copie. Mais les objets de type string disposent d'une fonction très pratique :
    Ça te permet de renvoyer la valeur de la chaîne sous forme d'un char*. Mais n'oublie pas d'utiliser strcpy, car sinon tu ne feras que copier l'adresse de ta chaîne, et tu auras des soucis...

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si ces conversions char* string te posent probleme, tu peux regarder du coté de getline(istream, token, ';').

    Regarde là faq sur ce sujet

  12. #12
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    oui avec le code ça ira mieux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    struct STableau{
              char Login[20]
                    };
      STableau tableau[20];
    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
     
    fgets(szLine, L_PRM_LINE, fp);
      while(!feof(fp))
      {
    	char * pch;
    	int	l;
    	l = 1;
     
    	//supprimer les caractères de szLine
    	StrTrimLen(szLine, '\0', 0);
            StrTrimLen(szLine, '\n', 0);
            StrTrimLen(szLine, '\r', 0);
     
    	  //mettre à zéro la "cellule" 0
    	strcpy(tableau[0].Login, "");
     
    	// szLine entière
           dprintf(ROUT, "Début de szLine : %s\n", szLine);	
     
           // extraction du Login
           pch = strtok (szLine,";");
          strcpy(tableau[0].Login, pch);
          dprintf(ROUT, "1ere valeur du tableau : %s\n", tableau[0].Login);
     
          //Parcourir les valeurs suivantes
          while (pch != NULL)
          {
    	pch = strtok (NULL, ";");
    	dprintf(ROUT, "mes valeurs de pch avant inc après le ';' : chiffre :%d    %s\n",l, pch);
     
            // REMARQUE
           // Quand mon pch vaut NULL, mon programme plante à ce moment là    strcpy...
     
            strcpy(tableau[l].Login, pch);
            l++;
          }
    Pour que ça fonctionne de a à z voici ce que je fais, c'est une usine à gaz, et je ne sais meme pas pourquoi ça fonctionne...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private:
      CString		m_strLogin;
    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
     
    fgets(szLine, L_PRM_LINE, fp);
      while(!feof(fp))
      {
    	char * pch;
    	int	l;
    	l = 1;
     
    	//supprimer les caractères de szLine
    	StrTrimLen(szLine, '\0', 0);
        StrTrimLen(szLine, '\n', 0);
        StrTrimLen(szLine, '\r', 0);
     
    	  //mettre à zéro la cellule 0
    	strcpy(tableau[0].Login, "");
     
    	// szLine entière
       dprintf(ROUT, "Début de szLine : %s\n", szLine);	
     
       // extraction du Login
       pch = strtok (szLine,";");
       strcpy(tableau[0].Login, pch);
       dprintf(ROUT, "1ere valeur du tableau : %s\n", tableau[0].Login);
     
       //Parcourir les valeurs suivantes
       while (pch != NULL)
       {
    	pch = strtok (NULL, ";");
    	dprintf(ROUT, "mes valeurs de pch avant inc après le ';' : chiffre :%d %s\n",l, pch);
     
           // Quand pch est NULL sortir
    	if(pch == NULL)
    	{
    		break;
    	}
    	strcpy(tableau[l].Login, pch);
    	switch(l)
    	{
    	case 1 :strcpy(tableau[l].Login, pch);
    	     	dprintf(ROUT, "Valeur de ma nouvelle variable tableau : %s\n", tableau[l].Login);
    			m_strLogin = tableau[l].Login ;
    			dprintf(ROUT, "Valeur de ma nouvelle variable m_strLogin : %s\n", m_strLogin);
    			break; ........ ect...
    l++
    }
    résultat final, ma variable m_strLogin reçoit t au lieu de recevoir tutu.

    je ne sais pas si c'est assez claire pour vous, parce que même pour moi par moment ce n'est pas claire

  13. #13
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    Voila, j'ai compris pourquoi j'avais un problème avec le strtok. voila la solution. Maintenant je me penche sur mes types de données. Char vers CString.

    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
     
    fgets(szLine, L_PRM_LINE, fp);
      while(!feof(fp))
      {
    	char * pch;
    	int	l;
    	l = 1;
     
    	//supprimer les caractères de szLine
    	StrTrimLen(szLine, '\0', 0);
            StrTrimLen(szLine, '\n', 0);
            StrTrimLen(szLine, '\r', 0);
     
    	  //mettre à zéro la "cellule" 0
    	strcpy(tableau[0].Login, "");
     
    	// szLine entière
           dprintf(ROUT, "Début de szLine : %s\n", szLine);	
     
           // extraction du Login
           pch = strtok (szLine,";");
          strcpy(tableau[0].Login, pch);
          dprintf(ROUT, "1ere valeur du tableau : %s\n", tableau[0].Login);
     
          //Parcourir les valeurs suivantes
          while (pch != NULL)
          {
    	dprintf(ROUT, "mes valeurs de pch avant inc après le ';' : chiffre :%d    %s\n",l, pch);
            strcpy(tableau[l].Login, pch);
            l++;
     
            // il fallait mettre cette instruction en fin de boucle
    	pch = strtok (NULL, ";");
    }
    Pour répondre à vos réponses j'ai essayé le strcpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     strcpy(m_strLogin, tableau[l].Login)
     
    erreur : strcpy' : cannot convert parameter 1 from 'class CString' to 'char *'

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    J'avais un doute, mais je crois qu'il se précise : tu n'enregistres jamais la 1° valeur.
    Et tu enregistrerais 2 fois la 2° valeur.
    N'as-tu rien remarqué de tel ?

    Quant à strcpy et CString
    - strcpy c'est du C !
    - tu es en C++ !
    - tu utilises CString, pourquoi pas
    - CString a certainement surchargé l'opérateur = pour être utilisable avec un const char*
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    J'ai dans ma boucle un attribut int l qui à la valeur 1.
    J'enregistre bien le 1er élément, puisqu'il sera dans le tableau[0].Login. Et le 2eme sera dans le tableau[l].Login qui commence à 1. Donc il n'écrase pas la 1ere valeur

  16. #16
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    J'ai bien vu ton attribut et ton index (que l'on démarre normalement à 0), mais as-tu pris la peine de dérouler un peu ta boucle ?
    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
    // extraction du Login
           pch = strtok (szLine,";");
          strcpy(tableau[0].Login, pch);
          dprintf(ROUT, "1ere valeur du tableau : %s\n", tableau[0].Login);
     
          //Parcourir les valeurs suivantes
          while (pch != NULL)
          {
    	dprintf(ROUT, "mes valeurs de pch avant inc après le ';' : chiffre :%d    %s\n",l, pch);
            strcpy(tableau[l].Login, pch);
            l++;
     
            // il fallait mettre cette instruction en fin de boucle
    	pch = strtok (NULL, ";");
    }
    tableau[0] et tableau[1] ont la même valeur. Le premier token trouvé.

    Je n'ai pas utilisé strtok depuis longtemps, mais son fonctionnement et ton utilisation ne sont pas incorrect.
    La valeur retournée c'est un pointeur vers le début du morceau de chaîne trouvée. strtok modifie la chaîne en ajoutant des \0 au bon endroit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  17. #17
    Membre confirmé
    Inscrit en
    Février 2011
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 149
    Par défaut
    ben quand je regarde pas à pas dans mon fichier, j'ai bien ma 1ere valeur dans tableau[0].Login, après on passe dans ma boucle, et il passe bien à la deuxième valeur qui sera dans tableau[1].Login, puis la 3eme dans tableau[2].Login....

    et pour répondre à ce que tu me dis, j'ai bien deux valeurs différentes dans tableau[0].Login et le tableau[1].Login et qui correspondent parfaitement au fichier que j'ai lu.

  18. #18
    Membre très actif
    Profil pro
    professeur des universités à la retraite
    Inscrit en
    Août 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : professeur des universités à la retraite

    Informations forums :
    Inscription : Août 2008
    Messages : 364
    Par défaut
    Mais saperlipopette puisque tu es en C++ pourquoi diable ne pas utiliser les outils du C++ std::string, std::stringstream et tout ce qui va avec (même Visual C++ les supporte !!) ... plutôt que ces vieilles fonctions du C !
    Essaie de lire un peu des manuels sérieux sur le C++...

Discussions similaires

  1. fonction pour naviguer dans un tableau 2D et autres
    Par kreaseb dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/09/2010, 10h31
  2. Réponses: 5
    Dernier message: 10/08/2009, 21h48
  3. Réponses: 5
    Dernier message: 29/06/2009, 14h50
  4. ERREUR D INSERE DANS UN TABLEAU A PARTIR DE JTextField
    Par fatimazahrazaidi dans le forum JDBC
    Réponses: 1
    Dernier message: 06/04/2008, 18h15
  5. Réponses: 3
    Dernier message: 24/04/2006, 19h56

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