Lecture + conversion char->double

cs_obby Messages postés 91 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 12 octobre 2006 - 19 nov. 2005 à 18:54
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 - 21 nov. 2005 à 21:11
Bonjour,



Je suis un peu embéter car je ne vois pas trop comment faire
pour exposé mon petit souci. Je vais essayer d'être le plus clair
possible.



En fait, je dois récupérer des valeurs organisées en colonnes
dans un fichier. En fait, j'ai plusieurs colonnes qui correspondent à
des choses différentes et qui sont séparé par des tabulations, par
exemple:



DATA1
DATA2
DATA3 DATA4..... '\n'

.0000E+00 .0000E+00
...

\n





le problème consiste à récuperer les valeurs. J'arrive à récuperer la
ligne entière sous forme d'une chaine de caractère et j'ai pensé à
utiliser la fonction "double atof(char*)". Cependant, comment faire
pour découper proprement cette chaine avant de faire la conversion. Et
est-ce que la conversion va prendre en compte la partie "E+00"??

10 réponses

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
19 nov. 2005 à 20:20
utilise sscanf(variable_contenant_ta_ligne,"le format",variables_recevant_le_text_séparé);



le format : exemple "%[^;];%[^;];" cela signifie qu'il prend tout le text avant le ; il y a deux %[^;]; car une part colone.



exemple de code :



sscanf(lecture,"%[^;];%[^;];%[^;];",data.nom,data.date,data.acces);



Voila, je me doute que l'explication est limite, si tu comprend pas trop, dit le moi j'esseyerai de te l'expliquer mieu.



Bon code



++ALL
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
20 nov. 2005 à 01:17
Mé non, c'est d'la perte de temps :)

Récupérer la chaîne et ballader un ptit pointeur :)
if(!Meilleur("Joky")) return ERREUR;
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
20 nov. 2005 à 09:39
Aussi, mais s il faut séparé pour mettre a chaque fois dans une variable différentes, le sscanf() est mieu.
0
cs_obby Messages postés 91 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 12 octobre 2006
20 nov. 2005 à 13:30
euh j'suis pas sur d'avoir bien compris comment on utilisait cette
fonction sscanf(). Cela récupère bien des chiffres et non des
caractères car la partie chaine de caractère, ca y'a pas trop de
problème.



je vais essayer pour voir ce que ca donne malgré tout.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
20 nov. 2005 à 13:51
Si tu n'y arrive pas esseye comme dit joky de "ballader un petit pointeur".
0
cs_obby Messages postés 91 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 12 octobre 2006
20 nov. 2005 à 14:28
il faut un %[^;]; pour chaque colonne ??? car si oui, il est évident
que cela n'est pas possible pour moi d'utiliser cette fonction car je
ne connait pas par avance le nombre de colonnes (ni de lignes) dans les
fichiers, cela est variable!!





Pour l'histoire du pointeur, j'ai essayé mais ca marche dans le mauvais sens, j'enlève la partie qui m'interresse :



f1.getline (c,512,'\n');

double a = 0.0;

d=c;

while (*d != '\n')

{

while(*d != ' ')

{

d++;

}

d++;

}
0
deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
20 nov. 2005 à 15:09
Ha autant pour moi je pensait que tu connaisait le nombre de colones. Oui alors le pointeurs est plus pratique.



exemple:



void recup(char *ligne){

char *lignetemp;

char carac;

lignetemp =ligne;

while(*lignetemp){

carac=*ligne;

if(carac==' '){

lignetemp++;

ligne++

}else{

*lignetemp=carac;

lignetemp++;

ligne++;

}

}

}

en claire, tantque la ligne est pas terminée on parcours la ligne et si
le caractère contenut dans carac est égale a tab en passe au caractère
suivant sans l'avoir affecter a la variable ligne temp.
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
20 nov. 2005 à 16:09
char *c = szChaine;

int iIndex 0, iSize 0,i=0;



Tant que *c différent de '\0'

Si *c == ' '

Alors copier de iIndex à iIndex+iSize szChaine dans une variable data[i]

Tant que *c == ' '

On avance le pointeur (c++)

et l'index (iIndex++)

Fin Tant Que

On incrémente i

On réinitialise la taille à 0 (iSize = 0)

Fin Si

On avance le pointeur (c++)

Si ce n'est pas le premier mot(i != 0)

On avance l'index (iIndex++)

Fin Si

On avance la taille (iSize++)

Fin Tant que



if(!Meilleur("Joky")) return ERREUR;
0
cs_obby Messages postés 91 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 12 octobre 2006
20 nov. 2005 à 17:57
voila ce que j'ai fait, ca marche pas mal, le seul problème c l'optimisation mémoire qui m'a pas l'air au top



for (int i = 0; i< NbLignes;++i)

{

f1.getline (c,512,'\n');

double a = 10.0;

d=c;

while (*d != 0)

{

CString tmp;

while((*d != ' ')&&(*d !=0))

{

tmp += *d;

d++;

}

d++;

int len = tmp.GetLength ();

val = new char [len];



for (int k=0;k<len;++k)

{

val[k] = tmp[k];

}

val[len]=0;

a = atof(val);

}
0
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
21 nov. 2005 à 21:11
bonsoir,



et un petit coup de strtok, non ?

Matt...
0
Rejoignez-nous