lire des float dans un .txt - C - Programmation
Marsh Posté le 26-04-2006 à 11:53:01
_darkalt3_ a écrit : strtok, atof |
Le probleme, c'est qu'avec atof, je perd ma partie flottante (d'apres ce que j'ai constater).
Si j'ia une chaine :
char str="0.169083"
j'obtient du "0.000000"
Mais merci pour strok, je ne connaissant pas et ça pourra p-e bien me servir si j'arrive a une conversion correct.
Marsh Posté le 26-04-2006 à 11:56:46
Heu j'ai rien dit a propos du cast, en faisant un test independant de mon fichier, j'ai bien obtenu ce que je voulais...
donc je vais re-essayer
Marsh Posté le 26-04-2006 à 11:58:40
lis ligne par ligne
pour chaque ligne fait une boucle:
strtod + sauter la ','
gaffe aux locales aussi
Marsh Posté le 26-04-2006 à 12:17:37
Taz a écrit : lis ligne par ligne |
Je m'interroge sur la meilleur maniere de recuper une ligne d'un coup.
une fonction approprier a ça?
Sachant que une ligne de mon fichier txt et censé correspondre a une ligne de ma matrice, mais que ça depasse apparament la longueur max qu'une ligne peut avoir, car elle est en faite sur 2 (vois plus celon les fichiers) lignes.
Je ne sais pas s'il y a un caractere de fin de ligne ou pas dans ces conditions?(il y en a un a la fin de la ligne de la matrice, ça c'est certain)
Marsh Posté le 26-04-2006 à 12:26:00
gargantua307 a écrit : Je m'interroge sur la meilleur maniere de recuper une ligne d'un coup. |
fgets(), c'est fait pour
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers
Marsh Posté le 26-04-2006 à 12:35:44
Emmanuel Delahaye a écrit : fgets(), c'est fait pour |
Ben le probleme c'est qu ej'ai besoin de la longueur de la ligne, or celle-ci peut etre variable (soit "pleine"(=max de car pour un fihcier txt sur une ligne), soit inferieur...et ça depend du fichier que j'ouvre (et il faut bien sur que ça marche pour tous )
Marsh Posté le 26-04-2006 à 13:08:03
gargantua307 a écrit : Ben le probleme c'est qu ej'ai besoin de la longueur de la ligne, or celle-ci peut etre variable (soit "pleine"(=max de car pour un fihcier txt sur une ligne), soit inferieur...et ça depend du fichier que j'ouvre (et il faut bien sur que ça marche pour tous ) |
Si tu le connais le max, c'est OK.
Sinon, il faut te faire une fonction de lecture 'souple' (malloc(), realloc()...). C'est un peu plus rusé...
J'ai une solution industrielle un peu, disons, 'avancée'...
http://mapage.noos.fr/emdel/clib.htm
Module IO
Marsh Posté le 27-04-2006 à 14:53:38
Bonjour,
bon je me suis remis sur mon prog et j'ai un souci (toujours).
En faite, j'arrive un peu pret a lire mon fichier(il ya a juste le saut de ligne qu'il faut que je gere), en utilisant fgets pour recup ligne / ligne les infos, et traitant la chaine avec strok et atof.
VOici mon code (extrais) :
Code :
|
Et voici la 1ere ligne de mon fichier :
|
Mon probleme : quand j'affiche mon tableau "tab", je n'ai que des "1.000000", soit la premiere valeur lu.
Comment resoudre le probleme???
Pourquoi n'avance t-il pas dans le fichier, ou la variable n'est-elle pas mis a jour??
Merci de votre aide.
Marsh Posté le 27-04-2006 à 14:58:32
man strtok:
Citation : The strtok() function can be used to parse the string s into tokens. The first call to strtok() should have s as its first argument. Subsequent calls should have the first argument set to NULL. Each call returns a pointer to the next token, or NULL when no more tokens are found |
tu appelles toujours strtok avec strTmp, et c'est pour ça que tu n'avances pas dans la ligne : tu parses toujours le premier jeton.
Marsh Posté le 27-04-2006 à 14:59:29
franceso a écrit : |
Effectivement!
Merci beaucoup
Marsh Posté le 27-04-2006 à 18:23:37
J'ai reussi a lire une ligne, la traité, obtenir ce que je voulais etc.
Il me reste un dernier bug que je n'arrive pas a supprimer.
Quand je veux passer a la deuxieme ligne, mon prog plante sur le fgets.
Je ne sais pas pourquoi.
j'ai essayer d'augmenter la longueur max lu pour etre sur que le \n etais bien lu, meme resultat.
J'ai essayer de faite un fgetc, meme resultat.
J'ai essayer de faire un fflush, meme resultat.
Je ne sais plus quoi faire...
Merci encore de votre aide precieuse.
Marsh Posté le 27-04-2006 à 18:31:13
gargantua307 a écrit : J'ai reussi a lire une ligne, la traité, obtenir ce que je voulais etc. |
il faut toujours tester la valeur retournée par les fonction de lecture. C'est elle qui determine si on a une fonc de lecture... La méthode canonique pour fgets() est :
Code :
|
Marsh Posté le 27-04-2006 à 18:41:29
Emmanuel Delahaye a écrit : il faut toujours tester la valeur retournée par les fonction de lecture. C'est elle qui determine si on a une fonc de lecture... La méthode canonique pour fgets() est :
|
Si j'ai bien compris
Données :
|
Code :
Code :
|
Ca recommence les délires avec les blocs 'code'...
Marsh Posté le 27-04-2006 à 18:41:57
Ben en faite, il me plante vraiment a la gueule.
Meme avec un while(fprintf(..)!=NULL) il plante a l'execution sans que je puisse faire quoi que ce soit d'autre.
D'ailleur si quelqu'un sait comment capturer les erreurs sur un projet fait avec VC++ en MFC... je ne sait pas de quel type elles sont.
Autre probleme, tout a l'heure j'ai remarquer que mon fclose du fichier planter lui aussi (depuis peu).
J'avais fait une erreur a un moment en faisant un fprintf sur le mauvais fichier (donc sur celui que j'ai en lecture), c'est dpeuis que j'ai observé que le fclose planté (la encore, impossible de traiter le retour de la fonction).
J'ai redemarrer etc, rien n'y fait.
Marsh Posté le 27-04-2006 à 18:46:50
gargantua307 a écrit : J'avais fait une erreur a un moment en faisant un fprintf sur le mauvais fichier (donc sur celui que j'ai en lecture), |
C'est sûr que si tu fais un fprintf() sur un fichier en lecture, ça va morfler...
Efface ton fichier douteux.
Et poste ton code, qu'on y voit clair...
Marsh Posté le 27-04-2006 à 18:52:53
Voici ma fonction en entiere (certain truc ne sont pas tres beau et temporaire en "debugage", mais c'est a force de bidouillage...je referai un peu le propre apres).
Code :
|
Marsh Posté le 27-04-2006 à 18:55:23
gargantua307 a écrit :
|
C'est quoi CString ?
Marsh Posté le 27-04-2006 à 18:56:49
Emmanuel Delahaye a écrit : C'est quoi CString ? |
C'est ce que me renvoi mon champ 'edit' de mon interface.
Mais il est converti implicitement en char* sans probleme.
edit : interface en C++
Marsh Posté le 27-04-2006 à 19:11:06
A noter que je viens d'essayer avec d'autre fichier (pour mon histoire du fclose qui plante), et ça fait la meme chose...!
Alors est-ce que par hasard qq chose pourrait corrompre le stream du fichier ouvert et tout faire planter donc?
Marsh Posté le 27-04-2006 à 19:20:11
passe le debugger, vérifie tes variables, vérifie que tu dois rien flusher ...
Marsh Posté le 28-04-2006 à 00:53:21
Si tu es en MFC, tu fais du C++ et les malloc/free ne sont pas forcément du meilleur effet !
Marsh Posté le 28-04-2006 à 09:41:52
Trap D a écrit : Si tu es en MFC, tu fais du C++ et les malloc/free ne sont pas forcément du meilleur effet ! |
Bah, les malloc sont casté, donc a priori pas de probleme.
Mais en faite il n'y a que mon interface en C++, le reste je prog en C. (sauf le param CString, j'avoue que j'ai eu la flem de le convertir avant puisque ça marche...).
Bon, sinon si je ne lis qu'une seul ligne, je sort de ma fonction niquel, donc j'retourne sur ma fonction "principale", et j'en sort (donc j'arrive dans ma fonction "OnClikButton" d'ou est d'éclenché tout ça, je ne plus rien apres, et PAF, c'est la que ça plante. Alors la j'ai du mal a pigé...plus rien, sort sans probleme apparent (la trace fonctionne bien), et ça plante...?
Et sinon je n'arrive toujours pas a passé a ma deuxieme ligne >_<
Ce qui est tres embettant.
Marsh Posté le 28-04-2006 à 09:48:41
ReplyMarsh Posté le 28-04-2006 à 09:56:31
_darkalt3_ a écrit : use the force, use the debugger |
Ben l edebugger m'aide pas trop (je sais pas bien m'en servir non plus)
J'obtient ce message, mais je ne sais pas a quel niveau du code vu qu'il me pointe sur le code en assembleur.
Marsh Posté le 28-04-2006 à 09:59:09
gargantua307 a écrit : Bah, les malloc sont casté, donc a priori pas de probleme. |
On en a pendu pour moins que ça
Soit tu fais du C soit tu fais du C++
Et bon en C++ avec un boost::tokenizer et des flux, c'est torché en 20 lignes ...
Marsh Posté le 28-04-2006 à 10:02:49
gargantua307 a écrit : Ben l edebugger m'aide pas trop (je sais pas bien m'en servir non plus) |
it's time to learn.
Marsh Posté le 28-04-2006 à 10:03:17
Citation : |
Rien n'empeche d'utiliser du code C en C++.
Mais c'est une contrainte qu'on m'impose de rester en C.
Mais la langage de l'interface est libre.
Je ne savais pas faire d'interface, j'ai appris a utiliser l'IDE de VC++ et les MFC.
Donc voila...
Mais dans tout les cas, mon probleme sur la lecture du fichier reste le meme...
Et pius bon, les malloc me retourne bien ce que j'attend.
Marsh Posté le 28-04-2006 à 10:04:21
gargantua307 a écrit : Rien n'empeche d'utiliser du code C en C++. |
Si: le bon sens.
Marsh Posté le 28-04-2006 à 10:05:54
_darkalt3_ a écrit : Si: le bon sens. |
Pas d'accord.
Si on devait se limiter a un seul langage a chaque projet...
Marsh Posté le 28-04-2006 à 10:14:16
gargantua307 a écrit : Pas d'accord. |
limitons nous à un seul langage par objet, et dans ton cas par fonction !
Marsh Posté le 28-04-2006 à 10:15:28
gargantua307 a écrit : Voici ma fonction en entiere (certain truc ne sont pas tres beau et temporaire en "debugage", mais c'est a force de bidouillage...je referai un peu le propre apres).
|
Tout tester (malloc, fopen, etc), c'est bien. C'est très bien en fait. Le pb, c'est que ta façon de tester te conduit à des if/else de folie. Et ton code "utile" se trouve totalement décalé.
C'est plus courant d'utiliser le style suivant
1) je fais un truc, je le teste et si ça plante je sors de la fonction
2) je passe au truc suivant
3) arrivé à ce point, je suis certain que tout est bon donc je peux coder tranquille => ça évite les "bool=1" etc... et ça permet de coder tout de suite la gestion de l'erreur (et non dans un lointain "else" 3 pages plus bas)
Ta fonction avec la gestion des erreurs réécrite
Code :
|
Marsh Posté le 28-04-2006 à 10:28:03
Merci bien.
J'ai tendance a prendre la mauvaise approche a chaque fois il est vrai.
Alors sinon :
pour :
if ((strTmp=(char*)malloc(sizeof(char)*(nb*2))) == NULL) // Pourquoi "nb * 2" ??? |
strTmp me sert a recuperer un ligne complete de mon fichier.
En faite j'avais oublier un p'tit details lorsque j'ai posté la fonction, mais actuellement la ligne est :
if ((strTmp=(char*)malloc(sizeof(char)*((8*nb)+nb)))=NULL) |
nb est le nombre d'élément / ligne. Ces élément on une longueur de 8. Il sont separer par des virgules (donc nb-1 virgule), et j'ajoute une place pour le car de saut de ligne '\n'.
J'ai donc une espace alloué pile poil a la longueur de ce que je lis.
if ((tab[i]=(float*)malloc(sizeof(float) * nb)) == NULL) // Pourquoi "* nb" ??? |
tab et un tableau 2 dim, qui est donc alloué dynamiquement.
nb et le nombre d'élément par ligne de ce tableau, ceci placé dans la boucle me permet d'allouer l'espace necessaire pour chaque ligne. La longueur des colonnes ayant deja etais aloué juste avant.
Note : il me semble que le C inverse les lignes/colonnes tels que j'ai les ai decrites, mais le resultat est identiques (quoiqu'il faudrait que j'ai repense pour une optimisation de temps).
Marsh Posté le 28-04-2006 à 10:32:00
gargantua307 a écrit :
|
Qu'est-ce que tu en sais ? Tu connais toutes les subtilités des deux langages ?
http://david.tribble.com/text/cdiffs.htm
Citation : |
Alors adieu MFC... Interesse toi à GTK+. en plus, c'est portable...
Marsh Posté le 28-04-2006 à 10:58:57
Emmanuel Delahaye a écrit : Qu'est-ce que tu en sais ? Tu connais toutes les subtilités des deux langages ?
|
Non, je ne serait pas arrogant a dire que je connait toutes les subtilités entre le C/C++.
Mais j'ai deja parcouru une liste d'incompatibilité comme celle que tu as indiqué, et n'y voit pas de probleme par rapport a mon code.
D'autant plus que je ne melange pas C++ et C dans une meme fonction, et que ma partie C et clairement separer du C++ (toujours exception faite du CString qui le compilo gere tout seul, mais si ça te fait plaisir je le cast avant).
Concernet GTK+, existe-t-il des IDE dessus?
Car j'étais intéressé, mais l'interface de mon prog n'etant pas vraiment important pour ce projet, je ne voulais pas me prendre la tete a coder l'interface integralement. C'est pour ça que j'ai opté pour le MFC, ou je peut creer l'interface en quelque clic avec VC++.
Il y a aussi le fait que je vais devoir créer une image a la fin (enfin sinon je vois pas bien comment faire) pour representer une grille, avec differentes couleurs, et la bibliotheque que l'on m'a indiquer et en C++ si je me souvient bien.
Marsh Posté le 28-04-2006 à 11:22:38
Bon, alors que je ne faisait que re-ecrire ma fonctoin pour une meilleur lisibilité, et bien tout mes probleme on disparu.
Plus aucune erreur, et le traitement que je voulais effectué.
Il devait donc bien y avoir une p'tite erreur quelque part.
En tout cas merci a tous.
Voici la fonction maintenant :
Code :
|
Marsh Posté le 28-04-2006 à 12:33:32
gargantua307 a écrit :
|
Hum. Tout d'abord, moi je mettrais "== NULL" plutôt que "= NULL". Au pire, ça n'en fonctionnera que mieux
De plus, "(8 * nb) + nb" s'écrit aussi bien "8 * nb + nb" (priorité de la multiplication sur l'addition)
Par ailleurs, chaque élément, virgule compris, fait "9" donc moi je mettrais plutôt
"sizeof(char) * 9 * nb"
Surtout que "8 * nb + nb" <=> "9 * nb"
Enfin, tu alloues "pile poil" la longueur de ce que tu lis... mais tu as oublié la place pour y stocker "pile poil" le '\0' qui termine toute chaîne =>
if ((strTmp=(char*)malloc(sizeof(char)*(9 * nb + 1))) == NULL) |
Marsh Posté le 28-04-2006 à 12:39:56
Sve@r a écrit : Hum. Tout d'abord, moi je mettrais "== NULL" plutôt que "= NULL". Au pire, ça n'en fonctionnera que mieux
|
P'tite erreur de frappe pour le = NULL ^_^
Sinon pour le calcul, j'ai decomposé pour une meilleur comprehension de ce que je fait, et j'ai deja remarqué qu'il me manqué un car pour le \0 et j'ai donc deja fait les modif ^_^
Merci quand meme pour la remarque tout a fait pertinente.
Marsh Posté le 26-04-2006 à 11:40:37
Bonjour,
voila, ça fait un moment que j'suis dessus a que ça bug dans tout les sens, alors je viens vous solliciter pour un peu d'aide.
Probleme :
Je dispose d'un fichier .txt, contenant une matrice de float entre 0 et 1.
Exemple :
1.000000,0.812725,0.782864,0.732827,0.678602,0.781187,0.743800,0.595378,0.854859
,0.712598,0.637022,0.600580,0.868002 etc...
Donc les différentes valeurs sont séparés par des virgules, comme vous avez pu le voir.
Mon but (a ce stade), et de lire ce fichier pour obtenir un tableau 2dim de float que je puisse ensuite manipuler comme bon me semble.
Mon probleme : je n'arrive pas a lire ce fichier comme il faut.
J'ai essayer avec :
Mais ça plante.
J'ai essayer a coup de fgets/fgetc, et de cast le tout ensuite, mais le probleme ce situe au niveau du cast, je n'arrive pas a recuperer la partie flottante correctement (mise a 0 lors du cast).
Bref, j'suis un peu perdu dans le sfonction que je pourrai utilisé, pour obtenir du float a partir de ce fichier .txt.
J'ai essayer de l'ouvrir en binaire pour recup des float mais ça deconne pas mal...
Si vous avez des suggestions...n'hesitez pas!!
Merci!