Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3050 connectés 

  FORUM HardWare.fr
  Programmation
  C

  strtok à partir d'un fichier.txt j'ai besoin d'aide svp

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

strtok à partir d'un fichier.txt j'ai besoin d'aide svp

n°1741070
jejescorpi​o
Posté le 03-06-2008 à 22:58:38  profilanswer
 

Bonjour à tous,
Je me présente je suis actuellement en 1ére année d'école d'ingé sur Lyon.
Pour la fin de cette année nous avons un projet en C à réaliser.
Le but du programme est le suivant :
Ouverture d'un fichier.txt, extraction des données : des points avec leurs coordonnées et les faces qu'ils composent, calculd e l'aire total de la figure, écriture des points et de leurs coordonnées dans un certain ordre dans un nouveau fichier.txt et écriture de la valeur de l'aire.
 
Voici un extrait du fichier txt source :
 
 P C 2. 10. 0.
 F F1 A C B
 
Les lignes commençant par P signifie Point, le caractère suivant est le nom du point et ensuite les trois coordonnées.
De même la suivante signifie une face, de nom F1 composée des points A C, et B.
 
Pour extraire les données concernant les lignes P il n'y a pas de soucis, je sais qu'il y a après la clé, le nom à obtenir et 3 coordonnées.
Par contre pour les lignes F c'est différent le nombre de point composant chaque face n'est pas identique.
J'utilise donc un strtok avec une fonction while en vérifiant que le token renvoyé n'est pas NULL.
La fonction marche bien pour A, pour C, mais pas pour les caractères en fin de ligne.
En effet, au lieu d'avoir 'B' dans mon token, j'ai 'B␍' le ␍ s'affichant comme un carré en fait.
Donc bien sur comme je compare le token avec ma base de donnés contenant le point 'B' celui ci n'est pas reconnu, etc etc.
J'ai essayé différente méthode, à savoir recherché tous les '\0' et les '\n' des lignes et les remplacers par '\t' '\0' (Si le dernier point est suivant d'une tabulation, alors là ça marche).
 
Bon j'ai peut-être perdu beaucoup de gens sur mon explication pas forcément très claire, mais s'il vous plait j'ai besoin d'aide.
Je colle ci-dessous la partie du programme concernée.
 
while(fgets(string,100,fichier)!=NULL)
 {  
 
  // Troncature de la ligne après un point d'exclamation
  pok=strchr(string,'!');
  if(pok!=NULL)
  {
   *pok='\n';
   *(pok+1)='\0';
  }
   
  // Acquisition une par une des chaînes de caractères séparées par les élèments définis dans seps[]
  token=strtok(string,seps);
 
  if(*token=='F') // Traitement de la ligne pour une clé F: face
  {
   token=strtok(NULL,seps);  // Get next token
   strcpy(tff->tab_face[kf].name,token);
 
   nb=0;
 
   token=strtok(NULL,seps);  // Get next token
 
   
   // Ici j'essaye d'insérer une tabulation afin chaque caractère de fin de ligne, mais ça ne marche pas.
   /*pok2=strchr(string,'\0');
   if(pok2!=NULL)
   {
    *pok2='      \0';
   }*/
 
   while(token!='\0') // On parcourt la ligne jusqu'à la fin
   {
    // Structure en for if, consomnation de ressource inutile, mais ça marche.
    for(cpt=0 ; cpt<kp /*tss->nb_sommet*/ ; cpt++) // On parcourt notre base de nom de sommet
    {
 
                                        // Ici j'essaye de vérifier ce qu'il y a dans le token, mais je n'arrive pas à y accéder élément par élément.
     g=0;
     ln=strlen(token);
     while(strcmp((token+g),var)!=0)
     {
      strcpy(token2+g,token+g);
      printf("coucou" );
      g++;
     }
 
                                        // On compare avec le nom trouvé pour identifier le sommet
     if(strcmp( tss->tab_sommet[cpt].name , token )==0)
     {
      tff->tab_face[kf].rang[nb]=cpt;
      nb++;
     }
    }
    token=strtok(NULL,seps);  // Get next token
   }
   tff->tab_face[kf].nb_pt=nb;
   kf++;
  }
 
 }
 
 // Fermeture du fichier
 fclose(fichier);
 return slap;
}
 
Encore merci pour vos réponses.
 
Cordialement Jérôme

mood
Publicité
Posté le 03-06-2008 à 22:58:38  profilanswer
 

n°1741893
mIRROR
Chevreuillobolchévik
Posté le 05-06-2008 à 13:24:36  profilanswer
 

en effet j ai rien compris
tu dis qu a la fin du traitement de ta ligne "F F1 A C B " tu te retrouves avec un "B\0" et tu veux juste B :??:


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742054
jejescorpi​o
Posté le 05-06-2008 à 16:01:40  profilanswer
 

Bonjour, dsl c'est vrai que c'est pas très clair, mais tu as compris le principal.
Alors en fait c'est ça dans ma ligne F F1 A C B, mon programme détecte la clé, puis 'F1', nom de la face, puis ensuite je parcours la ligne jusqu'à la fin et à chaque fois que je trouve un nom de sommet, je le stocke et incrémente le nombre de point pour cette face de 1.
Je suis obligé de procédé de la façon suivante car je ne connais pas le nombre de point composant chaque face, celui ci est variable !
Pour A, ça marche, pour C également, mais pas pour B, en effet je me retrouve avec 'B...' mais je ne sais ce qu'est ce ... en plus que j'ai, apparement c'est pas le caractère de fin de ligne('\0').
En fait j'ai fait plein de test ce n'est ni \0, ni \n ni \v, ni \r, .. j'ai testé tout les caractères que je connaissais.
Je pense que c'est un caractère phantôme qui est du à l'écriture du fichier source avec un certain codage (différent de UTF8) et que visual basic ne prend pas en charge.
Du coup en plus du caractère de fin de ligne j'ai un caractère inconnu.
A ce niveau ça dépasse de loin mes compétences, et si quelqu'un sait comment faire pour éliminer ces caractères phantôme je suis preneur.
Ma dernière idée était de comparer un à un les caractère dans mon "token" à l'alphabet. Si le premier caractère faisait parti de l'alphabet et le suivant non je copiais uniquement le premier caractère de "token" dans un autre tableau grace a strncpy. Si les deux premiers était dans l'alphabet et pas le 3éme je copiais les deux premiers, etc etc...
Le problème c'est que je ne sais pas comment accéder a chacun des élements de "token" séparement.
voila comment est déclaré token, c'est un pointeur :
char *token.
Merci beaucoup

n°1742102
mIRROR
Chevreuillobolchévik
Posté le 05-06-2008 à 16:51:57  profilanswer
 

et le premier caractere de ton token c est quoi ?


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742154
jejescorpi​o
Posté le 05-06-2008 à 17:41:52  profilanswer
 

C'est le nom du point, dans mon token il y a soit juste le nom du point 'B' soit 'W...'
En fait d'après ce que j'ai compris token pointe sur les chaines de caractères comprises entre les séparateurs suivants :", \t" (fonction strtok)
 
Je sais accéder au premier caractère sur lequel pointe token, mais pas suivant, sais tu quel syntaxe il faut utiliser ?
Merci de ton temps.


Message édité par jejescorpio le 05-06-2008 à 17:42:28
n°1742192
mIRROR
Chevreuillobolchévik
Posté le 05-06-2008 à 19:07:25  profilanswer
 

je me doute bien que c est le nom du point
ce que je ne comprends pas c ets pourquoi aurais tu besoin de la suite  
et si tu sais acceder au premier caractere pourquoi pas au second ?
tu fais comment ?
 
pour le caractere bizarre j avoue que je suis aussi perdu que toi
c est probablement pas un caractere windowsien (je sais que mac utilise des caracteres autres que ceux de windows pour les fins/saut de ligne)
mais visiblement ton truc tient sur trois bits octets
 
(oui je suis pas un expert du tout [:ocolor])


Message édité par mIRROR le 06-06-2008 à 08:50:52

---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742193
jejescorpi​o
Posté le 05-06-2008 à 19:25:03  profilanswer
 

euh dsl, du coup je n'ai pas compris le sens de ta question : "  et le premier caractere de ton token c est quoi ? "
J'a besoin de la suite car en utilisant uniquement les lettres de A à Z je me limite a des figures à 26 sommets, et donc pour augmenter ce nombre les autres points sont compté de la manière suivante : 'AA', 'AB', etc.
 
En fait je n'arrive pas réellement à accéder au premier caractère, je triche, pour comparer deux chaine de caracère il faut normalement utiliser la foncion strcmp.
Moi je fais comme ça : (dans mon if) if( *tss.tab_sommet[cpt].name == *token ). tss.tab_sommet[cpt].name est ma base de sommet, il sont tous enregsitrés là, et je compare avec le token. Cette technique marche mais ne compare que le premier caractère de chaque chaine. Or pour un point qui s'appelle AA, cela ne marche pas.
 
Dans tous les cas si ce n'est pas un caractère windowsien, je n'ai trouver qu'une seule façon de contourner le problème, comparer un à un les caractère.
Si ce n'est pas possible, mon projet devra se limiter à des figures de 26 points maximum.


Message édité par jejescorpio le 05-06-2008 à 19:25:48
n°1742338
mIRROR
Chevreuillobolchévik
Posté le 06-06-2008 à 08:47:28  profilanswer
 

le sens de ma question c etait de te dire que les premiers (ou juste le premier) caracteres de ton token sont les seuls dont tu as besoin
ici ton caractere mac(admettons) n est que du bruit dont tu n as que faire, et rajouter un tab augmente encore ce bruit
donc d abord tu lis ton token et tu recuperes le nom entier de ton point et c est seulement ensuite que tu compares avec les points que tu as deja stockés


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742439
ptitchep
Posté le 06-06-2008 à 12:09:46  profilanswer
 

T'as essayé d'utiliser un debugger? Tu connaitrais le contenu de token et tu pourrais trouver le caractère qui te pose problème. Une fois identifié,  
if (token[taille-1]==caractère_qui_saoule)
     token[taille-1]=0;


---------------
deluser --remove-home ptitchep
n°1742530
jejescorpi​o
Posté le 06-06-2008 à 14:37:16  profilanswer
 

Bonjour, oui ptitchep j'utilise le débogueur de visual basic, et ce fameux caractère est représenté par un carré, donc inconnu de visual...
Par contre je vais essayer avec cette syntaxe si je peux accéder à chacun des caractère séparement.
 
Pour mIRROR, justement le problème c'est que je n'arrive pas à juste lire les premiers caractère sans prendre le bruit avec. strtok est sensé me renvoyer juste les caractères représentant le nom du point, donc pour lui le carré en est aussi un et donc il ne fait pas la différence.
Quand je rajoute une tabulation c'est sur ça augmente le bruit, mais surtout ça le déplace, la fonction strtok me renvoi bien les caractères avant la tabulations qu'il détecte comme séparateur et le bruit est mis tout seul dans le token suivant. Ensuite le bruit tout seul est comparé à ma base de point, il ne correspont pas et hop le problème est évité, mais en modifiant le fichier source, ce qui n'est pas en soi une très bonne solution.
 
Merci


Message édité par jejescorpio le 06-06-2008 à 14:44:41
mood
Publicité
Posté le 06-06-2008 à 14:37:16  profilanswer
 

n°1742545
ptitchep
Posté le 06-06-2008 à 15:04:55  profilanswer
 

je pensais à la valeur entière du caractère, pas sa représentation ASCII.
Au fait, je n'ai pas lu ton code (mets des balises stp) mais tu as bien fait gaffe à ça:
fgets()  lit  au  plus  size - 1 caractères depuis stream et les place dans le tampon pointé par s. La lecture s’arrête après EOF ou un retour-chariot. Si un retour-chariot (newline) est lu, il est placé dans  le  tampon. Un caractère nul ’\0’ est placé à la fin de la ligne.
?


Message édité par ptitchep le 06-06-2008 à 15:06:00

---------------
deluser --remove-home ptitchep
n°1742549
mIRROR
Chevreuillobolchévik
Posté le 06-06-2008 à 15:24:12  profilanswer
 

bon j ai du mal a me faire comprendre
tu fais token[0] tu testes s il est alphabetique (http://www.cplusplus.com/reference/clibrary/cctype/)
pareil pour token[1]...
jusqu a ce que tu tombes sur un caractere qui n est pas dans le nom du point
pas besoin de rajouter des \t


Message édité par mIRROR le 06-06-2008 à 15:24:26

---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742663
jejescorpi​o
Posté le 06-06-2008 à 19:01:55  profilanswer
 

Pour sa représentation en code ascii je n'arrive pas à l'avoir car ce caractère n'est pas en première position dans token. Je sais juste accéder au premier en procédant comme je l'ai indiqué plus haut.
Pour le fgets oui j'ai fait attention, ma lecture des lignes s'effectue sans problème à partir du fichier.
Le problème vient de la fonction strtok, juste avant la balise de fin de ligne j'ai un caractère non identifiable.
Quand je tape token[0], ou token[1] j'ai un message d'erreur comme quoi le "char ne peut devenir const char* dans les niveaux d'indirection".
token est déclaré en tant que pointeur.
 
Tout ce qui me manque c'est la syntaxe correcte pour accéder un à un aux élèments contenus dans token,
une fois que j'aurai ça tout ira mieux, j'ai déjà écrit le code pour "trier" le token.
 
Voila mon texte avec le caractère : A C Ble_caractere\0
La fonction me donne successivement : token = A, puis token = C, puis token = Ble_caractere.
J'ai rajouté la tabulations car du coup mon texte devient B \t le_caractère \0.
Et du coup j'obtiens A, puis C, puis B, puis le_caractere.
 
C'est quoi les "balises" dont tu parle ptitchep ?

n°1742667
ptitchep
Posté le 06-06-2008 à 19:17:38  profilanswer
 

les balises de code [ cpp ] [ / cpp ] (y'a un bouton "code" quand tu postes).

Code :
  1. int main()
  2. {
  3.         char token[3]="Bx"; /*x représente ton truc inconnu*/
  4.         if (token[1]==120) /*code ascii pour x, remplace par le code de ton char*/
  5.                 token[1]=0;
  6.         printf("%sn",token);
  7.     return 0;
  8. }



---------------
deluser --remove-home ptitchep
n°1742808
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 04:29:51  profilanswer
 

jejescorpio a écrit :

Pour sa représentation en code ascii je n'arrive pas à l'avoir car ce caractère n'est pas en première position dans token. Je sais juste accéder au premier en procédant comme je l'ai indiqué plus haut.
Pour le fgets oui j'ai fait attention, ma lecture des lignes s'effectue sans problème à partir du fichier.
Le problème vient de la fonction strtok, juste avant la balise de fin de ligne j'ai un caractère non identifiable.
Quand je tape token[0], ou token[1] j'ai un message d'erreur comme quoi le "char ne peut devenir const char* dans les niveaux d'indirection".
token est déclaré en tant que pointeur.
 
Tout ce qui me manque c'est la syntaxe correcte pour accéder un à un aux élèments contenus dans token,
une fois que j'aurai ça tout ira mieux, j'ai déjà écrit le code pour "trier" le token.
 
Voila mon texte avec le caractère : A C Ble_caractere\0
La fonction me donne successivement : token = A, puis token = C, puis token = Ble_caractere.
J'ai rajouté la tabulations car du coup mon texte devient B \t le_caractère \0.
Et du coup j'obtiens A, puis C, puis B, puis le_caractere.
 
C'est quoi les "balises" dont tu parle ptitchep ?


il te manque carrement toutes les bases
serieux lis tes cours c est impossible que t aies jamais vu comment te ballader dans une string :/


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742828
jejescorpi​o
Posté le 07-06-2008 à 11:02:48  profilanswer
 

Il ne me manque pas de cour, je sais comment me balader dans une chaine de caractère, le problème c'est que token est un pointeur, créé par la fonction strtok. Je sais également accéder aux éléments un par un d'une chaîne de caractère lorsque j'en ai l'adresse, c'est le principe du passage en argument dans les fonctions.
Là mon problème c'est que ce n'est pas moi qui fait pointer token, c'est cette fonction strtok.
Quand tu marque token[0] cette syntaxe ne s'utilise que si token est déclaré de la manière suivante :  

Code :
  1. char token[]

 c'est à dire en tant que tableau de caractère, or mon token est déclaré comme ceci :

Code :
  1. char *token

, c'est à dire en tant que pointeur.
Ensuite c'est la fonction

Code :
  1. token=strtok(string,seps)

qui lui attribue l'adresse de la chaîne de caractère à pointer.
 
Comme on peut le lire dans mon code j'accède de deux façons différentes aux éléments pointés par token :  
 

Code :
  1. if(*token=='F')


Mais comme je l'ai déjà dit cette syntaxe n'est pas très correct, même si elle marche.
De plus avec cette syntaxe je ne peux accéder qu'au premier élément de la chaîne pointée par token.
 
Dans mon cour pour accéder aux valeur suivante la syntaxe correcte est :

Code :
  1. *(token+1), *(token+2), ....


Mais ici ça ne marche pas, je ne sais pas pourquoi.
 
Ou alors j'utilise la fonction

Code :
  1. if(strcmp( tss->tab_sommet[cpt].name , token )==0)


Cette fonction fonctionne par argument c'est à dire qu'il faut lui entrer des pointeurs, ce que je fais.
Si les deux chaînes sont identiques elle renvoi la valeur 0. Les autres cas ne m'intéressent pas.
 
Ce projet est un projet de fin d'année, donc encadré par des profs, j'ai déjà passé 8h dessus en cour et 20h chez moi.
Si je suis venus sur ce forum demander de l'aide c'est que même mes profs ne comprennent pas pourquoi la syntaxe

Code :
  1. *(token+1)

, qui est théoriquement la bonne, ne marche pas.
 
J'ai déjà créé plein de programme travaillant sur des chaînes de caractère, comme par exemple un programme testant des palindrome. Dans ce dernier j'accédais aux chaînes de caractères par pointeur et donc pour comparer les phrases lettre par lettre j'utilise cette syntaxe avec l'*.
Ici les deux syntaxes que je connais ne marchent pas. La seule syntaxe que je ne sais pas utilisé c'est les pointeurs de pointeur. Je ne pense pas que ce soit ça, sinon la première syntaxe que j'utilise

Code :
  1. if(*token=='F')

ne marcherai pas.
 
S'il vous plais je suis venu ici pour avoir de l'aide, pas pour qu'on me dise qu'au bout d'un an de cour en C je ne suis pas capable de parcourir une chaîne de caractère, même si celle-ci est en argument.

n°1742830
Joel F
Real men use unique_ptr
Posté le 07-06-2008 à 11:07:51  profilanswer
 

jejescorpio a écrit :


Quand tu marque token[0] cette syntaxe ne s'utilise que si token est déclaré de la manière suivante :  

Code :
  1. char token[]

 c'est à dire en tant que tableau de caractère, or mon token est déclaré comme ceci :

Code :
  1. char *token

, c'est à dire en tant que pointeur.
Ensuite c'est la fonction

Code :
  1. token=strtok(string,seps)

qui lui attribue l'adresse de la chaîne de caractère à pointer.


 
oups caramba, tu n'as bien rien compris au truc.
token[0] ca marche avec char* et char [] , c'est quand même la base.
Si ton prof ne sait pas que toto[i] est équivalent à *(toto+i), change d'école ...
 
Ton truc plante certainement parce que le token renvoyait par strtok ne fait que 1 caractére. T'as lu la doc de strtok ou tu tapes du code au hasard ?

n°1742838
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 12:13:32  profilanswer
 

jejescorpio a écrit :


Comme on peut le lire dans mon code j'accède de deux façons différentes aux éléments pointés par token :  
 

Code :
  1. if(*token=='F')


Mais comme je l'ai déjà dit cette syntaxe n'est pas très correct, même si elle marche.
De plus avec cette syntaxe je ne peux accéder qu'au premier élément de la chaîne pointée par token.
 
Dans mon cour pour accéder aux valeur suivante la syntaxe correcte est :

Code :
  1. *(token+1), *(token+2), ....


Mais ici ça ne marche pas, je ne sais pas pourquoi.


ben si ca marche  
dans ton if(*token=='F') *token c est token[0] hein


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742866
jejescorpi​o
Posté le 07-06-2008 à 14:54:41  profilanswer
 

Ben le truc c'est que sous visual basic quand je déclare char *toto et que je veux accéder au deuxième élément avec la syntaxe toto[1] il me renvoi une erreur alors que quand je met *(toto+1) je n'ai pas d'erreur.
 
De plus si je remplace if(*token=='F') par if(token[0]=='F'); j'ai un avertissement à la compilation, et lors de l'exécution j'ai un problème de lecture.
 
Là j'avoue que je suis un peu paumé, normalement "token" contient une adresse et *token me redirige vers la valeur non ?
 
Pour strtok, oui j'ai lu la doc, on définit spes[] et *token et strtok rempli token avec une adresse qui pointe chaque chaîne de caractère entre les séparateurs défini. J'ai plus d'un caractère, j'ai vérifier en tournant avec le débogueur, et je l'ai également fait afficher après acquisition.


Message édité par jejescorpio le 07-06-2008 à 14:57:23
n°1742869
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 15:14:10  profilanswer
 

un pointeur n est pas un array hein


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742874
Joel F
Real men use unique_ptr
Posté le 07-06-2008 à 15:48:59  profilanswer
 

c'est quoi ton compilo de merde qui fait un warning la !
et au cas ou tu le saurais pas : VB != C

n°1742876
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 15:57:26  profilanswer
 

il parle peut etre de l ide [:petrus dei]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742885
Joel F
Real men use unique_ptr
Posté le 07-06-2008 à 16:39:04  profilanswer
 

bah dixit :

Citation :

j'ai un avertissement à la compilation


un IDE c'est un editeur de texte avec des poils

n°1742889
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 16:46:26  profilanswer
 

bah microsoft a son propre compilo c donc j imagine que c ets lui qui est associé a vs


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742913
Joel F
Real men use unique_ptr
Posté le 07-06-2008 à 17:49:57  profilanswer
 

moui mais faut pas confondre IDE et compilateur. Tu peut tres bien utiliser gcc (en trichant) avec l'IDE microsoft

n°1742914
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 18:01:14  profilanswer
 

ha mais j imagine bien mais deja qu il sait pas parser une chaine faudrait pas trop en demander [:ocolor]


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742928
jejescorpi​o
Posté le 07-06-2008 à 18:54:49  profilanswer
 

Je ne sais ce qu'est un array, à l'école on utilise visual basic, on ouvre des projet en console win32 et ensuite des élèments en c++. De plus nos profs n'accepte pas de c++, on doit uniquement utiliser des fonctions c.
Je ne sais pas non plus ce qu'est un IDE.
 
Je ne suis pas aussi calé que vous, mais apparement personne ne peut m'aider pour mon problème ? :(  
 
Ba c'est pas grave de toute façon on avait très peu de temps pour faire ce projet et on est seulement 3 à être arrivé aussi loin dans le programme, donc j'aurais pas une vilaine note mais bon c'est assez frustrant de savoir que mon programme est quasi fonctionnel juste à un petit détail près.
 
"[...]  Je traite des chaînes de caractère dans ce même programme, je les déclare comme ceci : char nom_fichier[] et ensuite je les parcours, ça marche très bien avec la syntaxe suivante : nom_fichier[].
Dans d'autre programme (ex TD3 EXO2) quand je passe en argument, j'utilise la syntaxe suivante : *(nom+i) par exemple pour décomposer une phrase caractère par caractère pour ensuite les trier, les compter, et les tocker dans un tableau.
Ici aucune de ces deux syntaxe ne fonctionne avec token et je ne sais pas pourquoi.
L'erreeur affichée correspondant à un problème de lecture [...]"
 
C'est un extrait du rapport que je vais rendre avec mon projet. Est-ce que je dis des choses aberrantes en terme de c ?
 
En tout cas même si je n'ai pas trouver d'où venait mon problème je vous remercie pour le temps que vous m'avez accordé.
 
Jérôme
 

n°1742930
Joel F
Real men use unique_ptr
Posté le 07-06-2008 à 19:05:08  profilanswer
 

quelle ecole juste pour la rajouter à ma black list ?
 
sinon pour ton probleme, je pense qu'il s'agit betement du fait que ta chaine de caractére n'as que UN seul caractère. As tu lu la doc de strtok pr voir comment on iterer sur les token ? ca se fait pas comme ça mets dans une boucle while.

n°1742933
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 19:09:46  profilanswer
 

Joel F a écrit :

c'est quoi ton compilo de merde qui fait un warning la !
et au cas ou tu le saurais pas : VB != C


j etais pas sur mais gcc aussi pete le warning si tu declares pas que c est un const  
apres bon je suis un noob et y a ptet encore des trucs que j ai pas compris
 

jejescorpio a écrit :

Je ne sais ce qu'est un array


 
oui bah je m en doutais :/


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1742941
jejescorpi​o
Posté le 07-06-2008 à 19:36:46  profilanswer
 

Oui pour itérer sur les token il faut écrire ça : token=strtok(NULL, seps);
Je n'utilise pas de boucle while car j'ai besoin de traiter chaque token après son acquisition.
Je ne peux pas itérer mon token avec une boucle while comme dans l'exemple fournit par visual, à chaque fois que j'obtiens le token suivant, l'ancien est supprimé, de plus au premier appel de la fonction strtok, un caractère de fin de ligne \0 est inséré à la place du premier séparateur dans la phrase. La phrase est donc perdu, en tout cas pour mon niveau.
 
Je suis sur que ma chaîne de caractère n'as pas qu'un caractère car quand je travaille avec des figures avec plus de 26 sommets les nom de point sont de type AA, AB, AC, et pour les points qui ne sont pas en fin de ligne, pour lesquels je n'ai pas ce problème de caractère inconnu, j'obtiens bien deux caractères dans mon token, et je stocke ces deux caractères dans ma base de face. Je les rappelle même ultérieurement pour les afficher à l'écran, et également pour les écrire dans un nouveau fichier texte.
De plus si mon token n'avait qu'un seul caractère je n'aurais pas de problème de caractère inconnu ce qui serait bien  :)  
 
De toute façon je n'ai pas de problème à ce niveau là.
 
Pour mon école il s'agit de l'ISTIL, je suis en filière mécanique, mais j'ai une formation en programmation c et unix. Certes ce n'est pas très poussé j'ai seulement eu 30h de formation, mais à la base c'est de la méca que je veux faire...
 
Juste pour mon rapport est-ce que vous le trouvez correct ? Je parle pas en terme orthographe,  savoir si j'utilise les bons termes?
 
Merci


Message édité par jejescorpio le 07-06-2008 à 19:45:38
n°1742947
jejescorpi​o
Posté le 07-06-2008 à 19:52:12  profilanswer
 

Juste mIRROR ce que tu appelle array , en français c'est un tableau ?

n°1742992
mIRROR
Chevreuillobolchévik
Posté le 07-06-2008 à 21:48:27  profilanswer
 

mouarf tu dis un jour que tu fais du c depuis un an puis apres que t as eu 30h de cours...
dans le second cas tes lacunes sont pardonnables
mais retiens bien que tu n as rien a gagner en te faisant passer pour ce que tu n es pas hein :/

 

ton rapport n est pas correct car ton code prouve que tu reussis bien a acceder a token[0] par *token
et fatalement tu as acces a *(token+1) donc token[1]

 

je vais te donner la marche a suivre parce que tu galeres et surtout parce que c est evident qu un projet de cette ampleur en fin d annee prouve que tu n as pas bossé beaucoup de c mais c etait important que tu arretes de nous raconter des conneries

 

le truc c est que tu reussis pas a lire le dernier token
je vais te donner l algo de base et tu devras le traduire en c (c est la charte du forum de programmation on ne donne pas de code: ca n a aucun interet didactique)
tu dois creer un while comme joel te l a conseillé avec un indice qui s incremente a chaque boucle et qui parcourt ton token
et tu utilises la fonction de la lib cctype dont je t ai fourni le lien plus haut pour determiner si ce caractere est alphabetique ou non
la tu obtiendras naturellement le nom du point, qu il comporte un ou une infinité de caracteres, et faire ton strcmp sur les points de ta base de donnees

 

par contre c est totalement idiot une formation unix/c quand tu fais du c sur windows :/
j avoue que je ne connais pas du tout la valeur des eol sur mac/unix
mais visiblement tu connais comme moi que ceux de windows et ton fichier de donnees a forcement ete fait sur l un de ces deux os
mets plutot sur ton rapport que le fichier de données etait piégé :D

 

sinon oui un array est un tableau et tu le maitrises pas du tout


Message édité par mIRROR le 07-06-2008 à 21:49:38

---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell
n°1743063
jejescorpi​o
Posté le 08-06-2008 à 10:05:09  profilanswer
 

Ben quand je dis un an ou 30h pour moi c'etais pas me faire passer pour autre, ça fait un an que je fais du c a raison de TP de 2h.
Pour la formation unix + c sur windows, en fait le but n'est pas de faire de nous des programmeurs, c'est juste pour nous faire découvrir les deux environnements.
 

Citation :

tu dois creer un while comme joel te l a conseillé avec un indice qui s incremente a chaque boucle et qui parcourt ton token


J'ai déjà essayé de faire ce que tu me dit : ici dans var j'avais juste mis 'A' pour tester.
J'ai essayé avec token+g, *(token+g), token[g], à chaque fois j'ai un avertissement à la compilation et un problème de lecture lors de l'éxécution, sauf pour la première syntaxe, là j'ai une erreur ce qui est normal en fait.
 

Code :
  1. g=0;
  2.      //ln=strlen(token);
  3.      while(strcmp((token+g),var)!=0)
  4.      {
  5.            strcpy(token2+g,token+g);
  6.            printf("coucou" );
  7.            g++;
  8.      }


 
J'avais également essayé ça : (toujours avec 'A' dans var pour tester, si le test était concluant j'aurais ajouter un for pour parcourir tout l'alphabet, je ne connaisais pas d'autre moyen.
 

Code :
  1. ln=strlen(token);
  2.      if(strrchr( (token),var) !=0)
  3.      {
  4.            strncpy(token2,token,ln-1);
  5.            printf("coucou" );
  6.      }


 
Ben sur unix en fait les caractère sont codés sur 2octets par exemple c3e8, alors que sous windows en UTF8 le même caractère sera codé e9. Donc j'ai juste supposé que c'était pareil pour le eol.
 
Juste c'est quoi la différence alors entre une chaine de caractère et un tableau ?
La chaîne de caractère faut la déclarer comme ça : char var[], mais un tableau c'est pareil ?

n°1743075
Joel F
Real men use unique_ptr
Posté le 08-06-2008 à 10:54:29  profilanswer
 

jejescorpio a écrit :


Ben sur unix en fait les caractère sont codés sur 2octets par exemple c3e8, alors que sous windows en UTF8 le même caractère sera codé e9. Donc j'ai juste supposé que c'était pareil pour le eol.


 
STOP tu melanges tout ...
un char est un char point. Ca fait CHAR_BITS bitset c'es tout ce qu'on lui demande. Le fait que ton fichier soit encodé en autre chose n'a rien avoir avec le système.  
Et bon, UTF8 est le mêm aprtout. Y a un truc que t'as du zapper dans les explications au combien foireuses de ton prof.
 
Sinon une chaine de caractére c'est un tableau qui se termine par le caractère '\0', c'est tout.
 
Et pour ton token[i] t'as encore pas compris que si t'as chaine fait 10 caractéres, c'ets logique que ca plante si tu accede au 11e ??

n°1743112
jejescorpi​o
Posté le 08-06-2008 à 12:50:00  profilanswer
 

Juste c'est pas la peine de s'énerver, ce dont je parle avec le codage de mon fichier texte est un problème très connu : les caractères phamtomes.  
Pour le token j'ai très bien compris ça, c'est pour ça que j'utilise la fonction strlen pour connaitre la longueur de mon token et ne jamais accéder à un élément hors de la chaine.
 
En gros je fais ça :  
ln=strln(token);
quand j'affiche ln il me met ln=2;
Quand je veux accéder au deuxième caractère de token donc à token[1], il me met une erreur de lecture. J'ai cette erreur qu'il y ai 'AA' dans token ou 'Acaractère_inconnu'.
Même si je suis une quiche, je pense que c'est quand même une erreur de syntaxe.
 
Donc c'est bien beau de me dire que je suis nul, que j'y connais rien, que je suis dans une école bidon, et que j'ai des profs pourri, en attendant je suis toujours avec mon problème malgré vos explications.
 
Je n'ai de toute façon plus le temps de m'en occuper, je dois le rendre lundi.
Merci quand même.
 
A+

n°1743123
Joel F
Real men use unique_ptr
Posté le 08-06-2008 à 13:27:06  profilanswer
 

ca n'existe pas le probleme des caractères fantomes. Les donénes sont là ou pas là, point.
 
Truc debile, t'as testé avec une chaine de caractère constante rentrée à la main et non pas lu depuis ton fichier ? Parce que n'as aucune raison si tout est correct comme tu le dit si bien :o de planter la, c'est PAS une erreur de syntaxe hein. Des millions de lignes de codes utilsie tab[i] sans problemes hein :o

n°1743145
jejescorpi​o
Posté le 08-06-2008 à 14:54:14  profilanswer
 

Oui j'ai testé avec une chaine rentrée à la main, de plus dans d'autre programme que j'ai fait, ça marche.
C'est le premier programme où je lis depuis un fichier .txt et où j'utilise strtok.
 
Vous pouvez me répétez autant de fois que vous voulez que tab[i] marche très bien, ça a marché dans tout mes autres programmes, mais dans celui-ci j'ai une erreur quand je l'utilise et c'est pour ça que je suis venu demander de l'aide.
 

Citation :

Les donénes sont là ou pas là, point.


Oui c'est indéniable, mais suivant par "qui" elles sont lues elles ne sont pas interprétées de la même façon.
 
P-S : désolé pour l'orthographe de fantome phamtome

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  strtok à partir d'un fichier.txt j'ai besoin d'aide svp

 

Sujets relatifs
[Shell] boucle avec des nom de fichier avec espaceInsertion caractere dans un fichier
Aide pour une macroScript TCL Eggdrop ... Variable dans un fichier txt
[ C ] Besoin d'aide pour afficher l'heure en temps réelLancer Tomcat partir dune application java
[ bash ] date de dernière d'un fichier[Fini]Aide formulaire qui ne fonctionne pas :/
[ASP.NET] Accéder aux objets du Global.asax à partir d'un codefile ? 
Plus de sujets relatifs à : strtok à partir d'un fichier.txt j'ai besoin d'aide svp


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR