begin process at 2012 05 30 12:04:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Débutant(e)

 > 

strtok - probleme d'encapsulation?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

strtok - probleme d'encapsulation?

mercredi 23 juillet 2008 à 17:56:17 | strtok - probleme d'encapsulation?

Chris8412

Bonjour a toutes et a tous!

Voici mon premiere message sur votre forum. Avant de poser ma question, félicitations et merci a tous pour cette source d'infos gigantesque qu'est cppfrance! Ca fait environ un mois que je le parcours tous les jours pour trouver des solutions a mes problemes et apprendre le C++ ....

Malgres tout, j'ai un probleme et je n'ai pas trouvé comment le résoudre, ou du moins pas encore, mais apres un gros mal de tete, me suis dis que peut-etre vous pourriez éclairer la lanterne d'un tout jeune programmeur en C++.

Voila, j'utilise strtok pour trouver des chaines de caracteres dans un fichier que j'ouvre au préalable.
Ce fichier ressemble a ceci :

toto      titi      tata      tutu
toto2    titi2    tata2    tutu2
...

chacune des chaines de caracteres est séparée par une tabulation et chaque ligne par un retour a la ligne... rien d'extraordinaire.

J'ai testé strtok sur une ligne, cela marche nickel.
J'ai testé sur une colonne, cela marche nickel.
Mais quand je mixe els 2 cela ne marche pas....

Voici mon bout de code :

char *p1, *p2;
char *input = Buffer;
p1 = strtok (input,"\r\n");
   while (p1 != NULL) {

   TListItem *pItem = ListViewText->Items->Add();
   p2 = strtok(p1, "\t");
  while (p2 != NULL)  {
      pItem->SubItems->Add (p2);
      p2 = strtok (NULL, "\t");
  }

  p1 = strtok(NULL,"\r\n");
}



En fait lorsque j'execute la ligne p2 = strtok(p1, "\t");  p1 qui jusque la contenait bien ma ligne en entier, passe subitement a la valeur de p2 ... soit le premier élement de ma ligne.

Quelqu'un aurait-il une idée sur la question?

PS : si jamais la réponse existe déja et que je ne l'ai tout simplement pas trouve sur le forum, je m'en excuse ...

Merci beaucoup
Chris

mercredi 23 juillet 2008 à 21:20:15 | Re : strtok - probleme d'encapsulation?

Lucky92

Bonsoir,

une des possibilités pour résoudre ton problème est d'utiliser du vrai C++ standard ( en effet strtok c'est une fonction C ).

#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
...
ifstream file( "input.txt" ) ;
string line ;
while ( getline( file , line )  )
{
    TListItem *pItem = ListViewText->Items->Add();
    istringstream iss( line );
    string word ;
    while ( iss >> word )
    {
        pItem->SubItems->Add( word.c_str() );
    }
}
...

Personnellement, je trouve que la résolution de ce type de problème est nettement plus simple en C++ standard. Désolé si je ne répond pas vraiment à ta question...
j'ai essayé de débugger ton programme, mais finalement,  c'est plus rapide d'écrire le code ci-dessus que de se replonger dans la doc de strtok.
jeudi 24 juillet 2008 à 09:31:32 | Re : strtok - probleme d'encapsulation?

Liverion

Réponse acceptée !
Il me semble que c'est indiqué dans la doc du strtok , mais voila l'explication : strtok modifie la chaine qu'on lui passe en entrée, tout le temps. Il te suffit donc d'utiliser une variable temporaire dans laquelle tu stockerais la valeur de ton p1 :

char *p1, *p2,*tmp;

char *input = Buffer;

p1 = strtok (input,"\r\n");

   while (p1 != NULL)
  {

      TListItem *pItem = ListViewText->Items->Add();

        *tmp1 = *p1;

  p2 = strtok(tmp1, "\t");
   while (p2 != NULL) 
{
       pItem->SubItems->Add (p2);
       p2 = strtok (NULL, "\t");
   }

   p1 = strtok(NULL,"\r\n");

}


~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
jeudi 24 juillet 2008 à 11:06:30 | Re : strtok - probleme d'encapsulation?

Chris8412

Bonjour bonjour!!

Liverion, j'ai déja essayé de passer par une variable temporaire mais ca n'a pas marché. En meme temps, j'avoue que c'était en fin de journée et du coup j'ai peut-etre commis une erreur que je n'ai pas vu ou mal interprétée. merci tout de meme pour l'info car au moins je saurais que j'étais pas loin de la solution !!

Lucky92, j'ai essayé ta méthode et j'avoue qu'elle est beaucoup plus simple et terriblement efficace!!!! Merci énormément!!

Ceci dit, j'ai rencontré un tout petit  probleme en l'utilisant. A savoir : l'un des string qu'elle doit me trouver est en fait le path d'une image. Mais sachant que l'image peut tout-a-fait se trouver dans "Mes documents" ... cela signifie que le path contient des espaces. Donc lorsque je cherche les mots dans ma ligne, il me coupe le path a chaque espace. Auriez-vous une idée?

PS : sachant qu'il s''agit d'une autre question qui découle de la premiere, dois-je faire un autre post? Si oui, je le créerai sans soucis

Merci encore a vous deux.

Chris

jeudi 24 juillet 2008 à 11:07:45 | Re : strtok - probleme d'encapsulation?

Chris8412

PS : j'ai mis les deux réponses en accepté, car elles répondent toutes les 2 a mon probleme...

Chris
jeudi 24 juillet 2008 à 20:11:13 | Re : strtok - probleme d'encapsulation?

Lucky92

Réponse acceptée !
Salut,

si ton path est délimité par des guillemets voici une adaptation possible du code :

#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
...
ifstream file( "input.txt" ) ;
string line ;
while ( getline( file , line )  )
{
    TListItem *pItem = ListViewText->Items->Add();
    istringstream iss( line );
    string word ;
    while ( iss >> word )
    {
            if ( *word.begin() == '\"'  && *word.rbegin() !='\"' )
            {
                string suite;
                while( *word.rbegin() != '\"' && iss >> suite )
                {
                  
word += " " + suite;
                }
            }

        pItem->SubItems->Add( word.c_str() );
    }
}
...

la traduction est la suivante :
si le mot lu commence par un " et ne se termine pas par un ", alors c'est qu'il y a une suite ; tant que le mot ne se termine pas par un " et que j'arrive à extraire une suite, je concatène un espace et la suite à mon mot.
lundi 28 juillet 2008 à 12:44:49 | Re : strtok - probleme d'encapsulation?

Chris8412

Désolé j'ai pris un long weekend ;)

Effectivement ca marche et en plus c'est on ne peut plus simple ... merci milles fois Lucky92 !!

Chris


Cette discussion est classée dans : ligne, probleme, p1, p2, strtok


Répondre à ce message

Sujets en rapport avec ce message

bug de gcc ? (constructeur C++) [ par vinc1008881 ] Bonjour, je rencontre un problème de constructeur avec gcc, à n'y rien comprendre : J'ai : class point{public : point (int, int, int); //constructeur. à l'aide pour fusioné la fonction getline + fct strtok [ par yanlou ] salut,voici mon problmé, je veux lire un fichier txt, je le fais avec la fonction getline. voici le code :#include #include #include int main(){    probleme de codage. [ par bigoctets ] Bonjour a toutes et a tous. Tout d'abord je suis désolé si ce message n'est pas dans le bon theme, mais il y en a tellement que ca m'a un peu perdu.Je tableau de chaine de caractère [ par fiorellafatma ] salut à tous je cherche à inverser les caractère des mot dans un tableau de mot voici montravail qui n'a pas marché et je vous demande de l'aide [^^p Probleme boucles Fstream comparaison [ par nerone21 ] Bonsoir a vous les serials codeurs, alors j'aurais besoin de vos lumiere car j'ai un petit gros probleme que je ne comprend pas.voici mon code en dess utilisation de la stl vector + la stl pair [ par anthony65 ] Bonjour,je voudrais savoir comment je peux lire les elements qui se trouve dans mon vector.Dans mon vector j'ajoute des pair, mon probleme est que je Probleme de pointeur [ par romainbisson ] if(ptr != NULL){           char s1[26];           strncpy(s1, ptr, 25);           ptr1 = strstr(s1, "=");           char *p1 = strtok(ptr1+1, esp);    Probleme d'execution CreateProcess [ par Dryko ] BonjourJe souhaite realiser une conversion d'image dans un programme en c++ en utilisant la ligne de commande suivant : convert -size 640x480 test.uyv probleme avec une chaine de caractere [ par joben22 ] Bonsoir, j'ai un petit soucis avec une fonction que j'essaie de coder. En fait, je lis le contenue d'un fichier, le place dans un char* et la j'aimer Probleme un peu bidon [ par romainbisson ] Bonjour,je souhaite ecrire dans monn fichier au début de chaque ligne,7,     7,7,mais je souhaite que sur la dernier ligne, il ne m'affiche pas le 7,f


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 8,440 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales