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 :

Lecture nombre flottant dans fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Lecture nombre flottant dans fichier
    Bonjour,

    Je souhaite lire dans un fichier des nombres decimaux avec 1 nombre aprés la virgule.
    Le probleme que je rencontre est lorsque j'arrive devant un "." d'un nombre.

    J'ai essayé de le contourner en ne plus lisant ce caracteres (ex: pour 10.3, je lis le 0eme nomre puis le 2eme nombre).
    Ce qui est bizarre est que lorsque je fait ca, le pointeur pointe toujours sur le premier nombre (j'espere que je me suis fait comprendre)

    Bref voici mon code (je suis sur qu'on peut faire mieux pour detecter la valeur du nombre avec fread mais je crois que je verrai ca apres)

    Petite precision: le nombre que l'on rentre est le nombre de points (chaque point a une abscisse et une ordonnée) . Un petit calcul nous donne le nombre de caracteres réels dans le fichier (n*6). (il faut que le nombre soit decimal avec un nombre apres la virgule). Je dois ensuite rentrer ces points dans un tableaux a deux dimensions

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
     
                 int i,u,v,n,k,hc,hp,jo,ju ;
    	hp=1;
    	hc=1;
    	int oui =0;
    	int res;
                 int t,s;
    	int res2;
    	int m=0;
    	int all;
    	float res_final;
    	char point_travail[60] ;
    	char point_clusters[60];
                 int *az=malloc(sizeof(int));
    	int *sav_pt=malloc(sizeof(int));
    	int *az1 = malloc(sizeof(int));
                 int *sav_clu=malloc(sizeof(int));
    	FILE *fichier_points;
    	printf("Entrer le nom du fichier ou vous avez entres les points travail : ");
    	scanf("%59s", point_travail);
     
     
    	fichier_points=fopen(point_travail,"r");
     
            while (!fichier_points) {
       		printf("\n !Probleme en lecture de %s ! \n",point_travail);
    		printf("\nEntrer le nom du fichier ou vous avez entres les points travail : ");
    		scanf("%59s", point_travail);
    		fichier_points=fopen(point_travail,"r");
    	}
     
     
            printf("\nEntrer le nombre de points : ");
            scanf("%i",az);
     
    	for(i=0;i<*az;i++) {
    		hp=hp+1;
    	}
     
    	n=hp-1;
     
     
    	float **point_utilisateur = malloc(sizeof(int*)*n);
    	 for (i = 0; i < n; ++i) {
    		 point_utilisateur[i] = malloc(sizeof(int)*2); 
    	}
     
    		t=2;
    		s=0;
    		m=-1;
    		all =0;
    		res=0;
    		res2=0;
    		res_final=0;
     
     for(i=0;i<6*n;i++) {
     
     
    		/* s permet de se positionner sur le nombre entier flottant (donc en 0, en 3, en 6, etc) */ 
                             /* t permet de se positionner sur le nombre apres la virgule du nombre decimal (donc en 2, en 5, en 8, etc) */ 
     		if (i==s*3 || i==t) {
            		fscanf(fichier_points,"%3i",sav_pt);
    			printf("\nsav_pt= %i",*sav_pt);
     
    		}
     
     
     
    		if (i==(s*3)) {
     
    			res=0;
    			res2=0;
    			res_final=0;
     
     
    			for(u=0;u<*sav_pt;u++) {
    				res=res+1;
     
    			}
     
    			s=s+1;
    		}
     
     
     
    		if (i==t) {
    			for(u=0;u<*sav_pt;u++) {
    				res2=res2+1;
     
     
    			}
    			t = t+3;
    		}
     
     
     
    		res_final = 10*res+res2;
    		res_final = (res_final/10);
                              /* res_final est le nombre final lu */
     
    		printf("\nres_final = %.1f",res_final);
     
    		if (all==0) {
    			all =1;
    			m=m+1;
    		}
    		else {
    			all=0;
    		}
     
    		/* m permet de placer le nombre au bon endroit du tableau */
                              /* all permet de savoir si on le met dans le tableau abscisses ou dans celui des ordonnées */
     
    		if(all==1) {
    			point_utilisateur[m][0]=res_final;
     
     
    		}
     
     
    		else {
    			point_utilisateur[m][1]=res_final;
     
     
     
    		}
     
     
     
     
            }
     
    	fclose(fichier_points);

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Pour lire des nombres flottants à partir d'un fichier texte, tu peux simplement utiliser fgets() pour le fichier ligne par ligne et utiliser strtod() ou sscanf() pour convertir les valeurs en nombres à virgule flottante de type double. Cela ne convient-il pas?

    Thierry

  3. #3
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut
    Est-ce toi qui crée ton fichier contenant les points en format flottant ?

    Car si c'est le cas, je n'ai pas vraiment lu ton code mais je te propose de contourné le problème en stockant tes coordonnées en valeur entière : tu multiplie par 10 pour avoir une précision à une décimal, puis après avoir relu depuis le fichier tu divise par 10 et tu retrouve ta décimal ... !

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par mujigka

    Pour lire des nombres flottants à partir d'un fichier texte, tu peux simplement utiliser fgets() pour le fichier ligne par ligne
    J'avoue que j'en ai aucune idée. fgets peut lit il un nombre qu'il soit flottant ou entier?

    Citation Envoyé par mujigka
    utiliser strtod() ou sscanf() pour convertir les valeurs en nombres à virgule flottante de type double.
    Les valeurs lues par fgets (si la reponse au dessus est positive) ne sont -elles pas deja des flottants (dans le cas de flottant dans le fichier)


    Merci de ta réponse

    Mikolay

  5. #5
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Pour lire un flottant à partir d'un fichier, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double d;
    FILE *f;
     
    ...
    fscanf(f,"%lg",&d);
    ...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par stephl
    Pour lire un flottant à partir d'un fichier, il suffit de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double d;
    FILE *f;
     
    ...
    fscanf(f,"%lg",&d);
    ...
    Ca n'a pas l'air de marcher
    De plus, qu'est ce que le format %g ?

    Merci de ta réponse

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mikolay
    Ca n'a pas l'air de marcher
    De plus, qu'est ce que le format %g ?
    J'aurais mis "%lf"...

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    J'aurais mis "%lf"...
    J'ai essayé également avec + %lf , mais même resultat malhreusement

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mikolay
    J'ai essayé également avec + %lf , mais même resultat malhreusement
    Montre un extrait du fichier de données et le code qui ne fonctionne pas.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Le code source que je veux utiliser est au dessus
    Le fichier que je veux utiliser est comme cela:

    /* debut fichier /* ( c'est pas un fichier c, juste une fichier texte sans les commentaires )

    4
    5.6
    6
    9
    12.6
    45.9

    /* fin fichier */

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mikolay
    Le code source que je veux utiliser est au dessus
    Je ne comprends pas pourquoi ton code est aussi compliqué. On t'a conseillé fgets() pour lire les lignes de texte et strtod() pour les convertir en valeur numérique. Tu as essayé ? Ca se fait en 20 lignes de code...

    Ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    4.000000
    5.600000
    6.000000
    9.000000
    12.600000
    45.900000
     
    Press ENTER to continue.

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Voici un petit exemple qui utilise fgets() et strtod():
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    static int clean_fgets(char const *s_buffer, FILE *fp);
     
    int 
    main(void)
    {
        int err = EXIT_SUCCESS;
     
        FILE *fp = NULL;
        char s_buffer[50] = {0};
        char *pc = NULL;
        char *pend = NULL;
        double nombre;
     
        fp = fopen("test.txt", "r");
        if (fp != NULL)
        {
            while (fgets(s_buffer, sizeof s_buffer, fp) != NULL)
            {
                if (clean_fgets(s_buffer, fp) != 1)
                {
                    for (pc = s_buffer; *pc != 0; pc = pend)
                    {
                        nombre = strtod(pc, &pend);
                        if (pc == pend)
                        {
                            break;
                        }
                        printf("%f\n", nombre);
                    }
                }
                else
                {
                    fprintf(stderr, "ATTENTION: l'entrée a été tronquée!\n");
                }
            }
            fclose(fp), fp = NULL;
        }
        else
        {
            fprintf(stderr, "Erreur: Impossible d'ouvrir le fichier!\n");
            err = EXIT_FAILURE;
        }
     
        return err;
    }
     
    /*
     *  Fonction de nettoyage à utiliser après fgets().
     */
    static int clean_fgets(char const *s_buffer, FILE *fp)
    {
        int err = 0; /* code d'erreur */
        char *pc = strchr(s_buffer,'\n');
     
        if (pc != NULL) /* L'entrée est OK. */
        {
            *pc = 0;
        }
        else /* L'entrée a été tronquée */
        {
            int c;
            while ((c = fgetc(fp)) != '\n' && c != EOF)
            {
                /* On ignore les caractères tronqués */
                continue;
            }
            /* On signale l'erreur de lecture */
            err = 1;
        }
        return err;
    }
    N'hésite pas à poser des questions si quelques chose n'est pas clair. Ce programme donne la sortie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    thierry@mujigka:~/devel/test$ ./test
    4.000000
    5.500000
    8.800000
    5.600000
    6.000000
    9.000000
    12.600000
    45.900000
    Thierry

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne comprends pas pourquoi ton code est aussi compliqué. On t'a conseillé fgets() pour lire les lignes de texte et strtod() pour les convertir en valeur numérique. Tu as essayé ? Ca se fait en 20 lignes de code...

    Ca donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    4.000000
    5.600000
    6.000000
    9.000000
    12.600000
    45.900000
     
    Press ENTER to continue.
    On m'a certes conseillé d'utiliser fgets mais si tu avais lu tous mes messages, j'ai quoté en disant que je ne comprenais pas tout et donc ne savait pas comment m'en sortir. Si tu peux m'expliquer, j'en serai ravi.

    Merci beaucoup

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup mujigka, je vais essayer d'analyser ce que tu m'as mis

    Bonne soirée

  15. #15
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Mikolay
    Ca n'a pas l'air de marcher
    Ah, oui? Ca marche très bien chez moi.
    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
    24
    #include <stdio.h>
     
     
    int main(void)
     {
     FILE *f;
     double d;
     int retval,count;
     
     if ((f=fopen("Double.txt","r"))==NULL)
      printf("Impossible d'ouvrir le fichier Double.txt\n");
     else
      {
      count=0;
      while ((retval=fscanf(f,"%lg",&d))!=EOF && retval)
       {
       ++count;
       printf("Nombre lu: %g\n",d);
       }
      fclose(f);
      printf("%d nombre(s) lu(s)\n",count);
      }
     return 0;
     }
    Citation Envoyé par Mikolay
    De plus, qu'est ce que le format %g ?
    Avec "%g", si le nombre a une valeur entière, alors il est affiché comme un entier.

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Mikolay
    On m'a certes conseillé d'utiliser fgets mais si tu avais lu tous mes messages, j'ai quoté en disant que je ne comprenais pas tout et donc ne savait pas comment m'en sortir. Si tu peux m'expliquer, j'en serai ravi.
    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par stephl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      while ((retval=fscanf(f,"%lg",&d))!=EOF && retval)
    Avec "%g", si le nombre a une valeur entière, alors il est affiché comme un entier.
    Certes, mais dans le scanf(), c'est un peu étrange, non ?

  18. #18
    Membre éclairé Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Points : 771
    Points
    771
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Certes, mais dans le scanf(), c'est un peu étrange, non ?
    Je suis d'accord que "%lf" est plus courament utilisé, mais "%lg" fonctionne aussi (cf K&R).

Discussions similaires

  1. Lecture de QString dans fichier binaire
    Par katanaenmousse dans le forum Qt
    Réponses: 18
    Dernier message: 28/10/2008, 09h22
  2. [Word] Lecture nombre de mots fichier docx
    Par acamentis dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 08/09/2008, 10h35
  3. lire flottant dans fichier texte
    Par Kastor45 dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 11/07/2008, 12h16
  4. lecture et ecriture dans fichier
    Par ould64 dans le forum AWT/Swing
    Réponses: 11
    Dernier message: 06/01/2008, 20h49
  5. [SQL-SERVER2K] Nombres flottant dans un SELECT
    Par andlio dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/08/2007, 14h18

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