IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lire une serie de donnees (type %f%f%f)


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut lire une serie de donnees (type %f%f%f)
    Bonjour,

    J’ai un problème lorsque je cherche à lire une série de données stockes dans un fichier .dat

    Ces donnes sont écrites de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0;i<n;i++) fprintf (fichier, "%f",myfloat[i]);
    donc finalement on obtient dans le fichier
    1.0000001.0000001.000000(...)1.0000000

    Et lorsque je cherche à lire le premier float,
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf(fichier,”%f”,myfloat[i]);
    je lis 1.0000001 (a la place de 1.000000) donc le suivant sera lu .0000001 et non 1.000000

    Je vois bien une solution pour résoudre le problème mais ca me parait bien complique

    (-convertir le premier float en string, supprimer le dernier élément de la chaine (1), convertir la chaine en float, supprimer le premier float du fichier et on recommence)

    Il doit bien y avoir un moyen bien plus simple non ?

    Sinon dans le même genre, si j’obtiens la taille de mon fichier avec la fonction stat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tailleenoctet=(int)buf.st_size ; /* j’ai bien la taille en octet, donc logiquement si je veux le nombre de valeur je fais:*/
    nombredepoint=tailleenoctet/sizeof(float) ; /* et la le résultat est incorrect, alors qu’avec sizeof(double) le résultat est bon. Pourtant j’écris bien des float dans ce fichier ! 
    (for(i=0;i<n;i++) fprintf (fichier, " %f",myfloat[i]); ) */

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nakor Voir le message
    Ces donnes sont écrites de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for(i=0;i<n;i++) fprintf (fichier, " %f",myfloat[i]);
    donc finalement on obtient dans le fichier
    1.0000001.0000001.000000(...)1.0000000
    Logiquement non Si dans le format de ton fprintf tu mets un espace devant chaque valeur tu es censé les avoir dans ton fichier ! Au pire, tu peux toujours séparer les valeurs par un séparateur comme ';' ou encore ',' !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    autant pour moi c'est une faute de frappe. Il n'y a reellement aucune delimitation entre deux nombres, pas d'espaces, pas de point virgule, rien du tout.
    Il n'y a pas un moyen de s'arreter de lire apres un certain nombre de decimales et de ne pas empieter sur le nombre suivant ?

    Si je rajoutes des espaces ou points virgules je vais augmenter la taille de mon fichier et ca ne me convient pas je prefererai stockes les valeurs a la suite sans rien pour les separer

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nakor Voir le message
    Il n'y a reellement aucune delimitation entre deux nombres, pas d'espaces, pas de point virgule, rien du tout.
    Il n'y a pas un moyen de s'arreter de lire apres un certain nombre de decimales et de ne pas empieter sur le nombre suivant ?
    Si, %nfn est égale au nombre de chiffre après la décimale !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    J'ai pas de compilateur sous la main main il me semble que %nf ne fonctionne qu'avec printf, et pas scanf non ?

    Sinon une idee sur le fait que je ne trouve pas le bon nombre de point avec ma division tailleenoctet/sizeof (float) ?

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nakor Voir le message
    J'ai pas de compilateur sous la main main il me semble que %nf ne fonctionne qu'avec printf, et pas scanf non ?
    Je ne sais pas, j'ai jamais utilisé les fonctions *scanf
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    bah je peux essayer de lire la ligne entiere avec gets puis des fonctions de conversion mais je vais arriver au meme probleme je pense, je vais encore empieter sur le premier chiffre du float suivant.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Franck.H
    Si %nf où n est égale au nombre de chiffre après la décimale !
    ....
    Je ne sais pas, j'ai jamais utilisé les fonctions *scanf
    Ce que c'est que l'intuition tout de même

    Toutefois, ce n'est pas le nombre de chiffres après la virgule, mais le nombre de caractères total

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par nakor Voir le message
    bah je peux essayer de lire la ligne entiere avec gets puis des fonctions de conversion mais je vais arriver au meme probleme je pense, je vais encore empieter sur le premier chiffre du float suivant.
    Déjà si tu envisage cette possibilité je te conseil fgets, gets ne doit plus jamais être utilisée ! Ensuite, moi c'est ma méthode en générale, mais je dois avouer que dans ton cas oui, ca risque d'être un peu lourd car là tu devrais lire caractère par caractère (tout en stockant dans un buffer temporaire) et t'arrêter au nombre de chiffre voulu après la décimale puis convertir avec strtod !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par nakor Voir le message
    ....
    Sinon une idee sur le fait que je ne trouve pas le bon nombre de point avec ma division tailleenoctet/sizeof (float) ?
    Apparemment, les floats sont codés en chaine de caractères dans le fichier. Le nombre de caractères pour un float n'a alors rien à voir avec sizeof(float)

  11. #11
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par diogene Voir le message
    Franck.H

    Ce que c'est que l'intuition tout de même

    Toutefois, ce n'est pas le nombre de chiffres après la virgule, mais le nombre de caractères total
    J'ai toujours plusieurs bouquins sous l'coude Merci en tous cas de cette précision
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  12. #12
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par diogene Voir le message
    Toutefois, ce n'est pas le nombre de chiffres après la virgule, mais le nombre de caractères total
    Exact... ne pas confondre avec %.nf où n représente bien le nombre de décimales

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    donc ma solution serait de lire une ligne entiere de mon fichier et de le stocker dans une chaine,
    de prendre les premiers termes de cette chaine jusqu'au premier signe "." puis les 6 suivants pour les decimales pour les mettre dans une autre chaine temp,
    de convertir ma chaine temp en float,
    repeter cette manoeuvre pour toute la ligne et passer a la ligne suivante ?

    quelques problemes avec ca :
    si on ecrit des floats dans un fichier, par defaut il y aura toujours 6 decimales ?
    Il va y avoir un probleme si un float est ecrit sur deux lignes differentes.
    combien il y a de caracteres par ligne dans un fichier .dat avant de passer arbitrairement a la ligne ?

    si les float sont codes en chaine de caracteres dans le fichier, cela veut dire que je n'ai aucun moyen de remonter au nombre de caracteres a partir de la taille du fichier ? Puisque la taille en octet d'un float dependra alors de son nombre de caracteres (1000.000000 != 1.000000 ?) et que je ne connais pas le nombre de caracteres de mes floats ...

  14. #14
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    si on ecrit des floats dans un fichier, par defaut il y aura toujours 6 decimales ?
    Oui

    Il va y avoir un probleme si un float est ecrit sur deux lignes differentes.
    Mais ce n'est pas possible

    combien il y a de caracteres par ligne dans un fichier .dat avant de passer arbitrairement a la ligne ?
    Je ne crois pas qu'il y ait une limite définie, mais ça dépend peut-être de l'implémentation

    Si je rajoutes des espaces ou points virgules je vais augmenter la taille de mon fichier et ca ne me convient pas je prefererai stockes les valeurs a la suite sans rien pour les separer
    La taille n'augmentera pas tellement (<12%)

    si les float sont codes en chaine de caracteres dans le fichier, ...
    Si c'est toi qui écris le fichier et le relis, écris en binaire ; le fichier sera plus court et tu connaîtras la taille du fichier en fonction du nombre de float. Mais le fichier obtenu ne sera pas portable.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    Pour le retour a la ligne d'apres ce que j'ai vu, le traitement de texte (blocnot ect) en fait un arbitrairement, mais c'est uniquement une histoire de mise en page, lorsque l'on lit le fichier avec fgets, le programme ne detecte pas de retour a la ligne.

    pour ce qui est de la taille 12% c'est assez consequent qund meme pour de larges quantites de donnees, comme des enregistrements sur plusieurs jours.

    finalement, je pense que je vais utiliser une fonction de la famille fgetc, pour lire caractere par caractere directement dans le fichier (ca evite la chaine intermediaire), stocker les caracteres que je lis dans temp, avec un test sur le caractere . et un compteur pour les 6 decimales, puis une fonction de conversion.

    Je l'ai fait avec fgets mais c'est un peu lourd comme procedure je vais essayer celle la pour voir si c'est plus rapide.

  16. #16
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    une solution très simple est, comme on l'a indiqué, d'écrire toujours avec le même format (par exemple 12.4) et donc de lire avec ce format, sachant que donc chaque nombre tiendra toujours sur 12 caractères..

    Après, les options te permettent de décaler à gauche (-), d'introduire des 0 devant ou derrière, etc..

  17. #17
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Ce programme à faire, c'est pour des cours ?

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 51
    Par défaut
    non pas vraimment les cours c'est plus pour un projet.

    sinon j'ai essaye d'utiliser fscanf(%nf) avec n le nombre de chiffre. Le probleme est qu'on peut difficilement savoir a l'avance le nombre de caractere qu'aura le chiffre (1000.000000 != 1.000000).
    A part si on ecrit les donnees soit meme, mais ce n'est pas assez general.
    et fscanf(%.nf) ne fonctionne pas avec scanf mais uniquement printf.

    en tout cas merci pour votre aide

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par nakor Voir le message
    et fscanf(%.nf) ne fonctionne pas avec scanf mais uniquement printf.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    p0 = chaine ;
    while ( p!= NULL )
    {
        c = *(p0+12) ;
        *(p0+12) = '\0' ;
        sscanf ( p0, "%f", &MyNb);
        (p0+12) = c ;
        p0 += 12 ;
    }
    si tu veux le faire comme ça, mais normalement fscanf marchera de 12 en 12..

  20. #20
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @souviron34
    Il ne connait pas le nombre de chiffres total, mais le nombre de décimale.

    Sur la même idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #define Decimale 6 
     char ligne[256]= "1.000004111.1235525124.987654";
     char * deb;
     char * end ;
     double f[100];
     int i;
     char save;
     i=0;
     // lire une ligne -> ligne : fgets
     deb = ligne;
     do
       if((end = strchr(deb,'.')) != NULL)
       {
          end += 1+Decimale;
          save = *end;
          *end = 0;
          sscanf(deb,"%lf",f+i);
          *end = save;
          deb = end;
          i++;
        }
     while (end != NULL);

Discussions similaires

  1. PDF d'une series de donnees statistiques
    Par Trafus dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/07/2011, 14h59
  2. lire une base de donnee ligne par ligne
    Par thildouille dans le forum Langage
    Réponses: 9
    Dernier message: 03/06/2011, 00h50
  3. Lire une base de donnees SQL au lieu de Access
    Par DEV-10 dans le forum VB.NET
    Réponses: 1
    Dernier message: 24/01/2008, 10h49
  4. [SQLBase Server 7.5.1]Comment lire une BDD de ce type?
    Par Niouts dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 06/04/2006, 19h53
  5. Creation d'une source de données de type JDBC
    Par tiboudchou dans le forum BIRT
    Réponses: 3
    Dernier message: 04/04/2006, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo