strtok à partir d'un fichier.txt j'ai besoin d'aide svp - C - Programmation
Marsh Posté le 05-06-2008 à 13:24:36
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
Marsh Posté le 05-06-2008 à 16:01:40
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
Marsh Posté le 05-06-2008 à 16:51:57
et le premier caractere de ton token c est quoi ?
Marsh Posté le 05-06-2008 à 17:41:52
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.
Marsh Posté le 05-06-2008 à 19:07:25
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 )
Marsh Posté le 05-06-2008 à 19:25:03
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.
Marsh Posté le 06-06-2008 à 08:47:28
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
Marsh Posté le 06-06-2008 à 12:09:46
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;
Marsh Posté le 06-06-2008 à 14:37:16
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
Marsh Posté le 06-06-2008 à 15:04:55
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.
?
Marsh Posté le 06-06-2008 à 15:24:12
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
Marsh Posté le 06-06-2008 à 19:01:55
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 ?
Marsh Posté le 06-06-2008 à 19:17:38
les balises de code [ cpp ] [ / cpp ] (y'a un bouton "code" quand tu postes).
Code :
|
Marsh Posté le 07-06-2008 à 04:29:51
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. |
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
Marsh Posté le 07-06-2008 à 11:02:48
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 :
|
c'est à dire en tant que tableau de caractère, or mon token est déclaré comme ceci :
Code :
|
, c'est à dire en tant que pointeur.
Ensuite c'est la fonction
Code :
|
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 :
|
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 :
|
Mais ici ça ne marche pas, je ne sais pas pourquoi.
Ou alors j'utilise la fonction
Code :
|
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 :
|
, 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 :
|
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.
Marsh Posté le 07-06-2008 à 11:07:51
jejescorpio a écrit :
c'est à dire en tant que tableau de caractère, or mon token est déclaré comme ceci :
, c'est à dire en tant que pointeur.
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 ?
Marsh Posté le 07-06-2008 à 12:13:32
jejescorpio a écrit :
|
ben si ca marche
dans ton if(*token=='F') *token c est token[0] hein
Marsh Posté le 07-06-2008 à 14:54:41
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.
Marsh Posté le 07-06-2008 à 15:14:10
un pointeur n est pas un array hein
Marsh Posté le 07-06-2008 à 15:48:59
c'est quoi ton compilo de merde qui fait un warning la !
et au cas ou tu le saurais pas : VB != C
Marsh Posté le 07-06-2008 à 15:57:26
il parle peut etre de l ide
Marsh Posté le 07-06-2008 à 16:39:04
bah dixit :
Citation : j'ai un avertissement à la compilation |
un IDE c'est un editeur de texte avec des poils
Marsh Posté le 07-06-2008 à 16:46:26
bah microsoft a son propre compilo c donc j imagine que c ets lui qui est associé a vs
Marsh Posté le 07-06-2008 à 17:49:57
moui mais faut pas confondre IDE et compilateur. Tu peut tres bien utiliser gcc (en trichant) avec l'IDE microsoft
Marsh Posté le 07-06-2008 à 18:01:14
ha mais j imagine bien mais deja qu il sait pas parser une chaine faudrait pas trop en demander
Marsh Posté le 07-06-2008 à 18:54:49
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
Marsh Posté le 07-06-2008 à 19:05:08
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.
Marsh Posté le 07-06-2008 à 19:09:46
Joel F a écrit : c'est quoi ton compilo de merde qui fait un warning la ! |
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
Marsh Posté le 07-06-2008 à 19:36:46
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
Marsh Posté le 07-06-2008 à 19:52:12
Juste mIRROR ce que tu appelle array , en français c'est un tableau ?
Marsh Posté le 07-06-2008 à 21:48:27
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é
sinon oui un array est un tableau et tu le maitrises pas du tout
Marsh Posté le 08-06-2008 à 10:05:09
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 :
|
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 :
|
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 ?
Marsh Posté le 08-06-2008 à 10:54:29
jejescorpio a écrit : |
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 ??
Marsh Posté le 08-06-2008 à 12:50:00
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+
Marsh Posté le 08-06-2008 à 13:27:06
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 de planter la, c'est PAS une erreur de syntaxe hein. Des millions de lignes de codes utilsie tab[i] sans problemes hein
Marsh Posté le 08-06-2008 à 14:54:14
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
Marsh Posté le 03-06-2008 à 22:58:38
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