Emmanuel Delahaye C is a sharp tool | ThibB a écrit :
Bonjour tous le monde !
Je rencontre un problème lorsque je cherche à lire des réels depuis un buffer : impossible de faire fonctionner le sscanf ... encore ...
Je lis en fait une ligne de 250 caractères dont les caractère 159 à 165 represente un litrage en mL, dans mon exemple : 1023800 (autre ex : <...>
Est ce que quelqu'un aurait une solution ?
|
A l'avenir, poste du code compilabel (j'ai passé 20 minutes à réinventer ce qui manquait...)
Ceci a l'air de fonctionner. Mais je recommande double au lieu de float. Meilleure précision, meilleures performances (pas de conversions).
Code :
- #include <stdio.h>
- #include <stdlib.h>
- /* 0 | 1 */
- #define DOUBLE 0
- struct data
- {
- #if DOUBLE
- double volumeCarbu;
- #else
- float volumeCarbu;
- #endif
- };
- struct x
- {
- struct data data[1];
- };
- static int f (struct x *s, char const *ligne, int i)
- {
- char buffer[20];
- {
- size_t k;
- for (k = 158; k < 165; k++)
- {
- buffer[k - 158] = ligne[k];
- }
- buffer[k - 158] = '\0';
- }
- #if DOUBLE
- if (1 != sscanf (buffer, "%lf", &s->data[i].volumeCarbu))
- #else
- if (1 != sscanf (buffer, "%f", &s->data[i].volumeCarbu))
- #endif
- {
- return 1;
- }
- s->data[i].volumeCarbu /= 1000;
- return 0;
- }
- int main ()
- {
- struct x x =
- {
- 0
- };
- char ligne[200] = "";
- /* 1023800 ml */
- ligne[158] = '0';
- ligne[159] = '1';
- ligne[160] = '0';
- ligne[161] = '2';
- ligne[162] = '3';
- ligne[163] = '8';
- ligne[164] = '0';
- ligne[165] = '0';
- int ret = f (&x, ligne, 0);
- printf ("%f ret=%d\n", x.data[0].volumeCarbu, ret);
- return 0;
- }
|
102.379997 ret=0
Press ENTER to continue.
|
avec double :
102.380000 ret=0
Press ENTER to continue.
|
Message édité par Emmanuel Delahaye le 28-07-2006 à 20:33:33 ---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
|