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 :

extraire une colonne de données à partir d'un fichier txt


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut extraire une colonne de données à partir d'un fichier txt
    Bonjour à tous,
    je suis débutant en C, j'ai besoin d'extraire une colonne de données issues d'un capteur. J'ai essayé d'appliquer le fonction fscanf mais ça ne marche pas je crois au moins j'ai un problème de conversion. Le programme n'arrive pas à lire toutes les données, en plus les données lues ne correspondent pas aux données d'origine dans le fichier txt.
    Pourriez vous m'aider svp,
    Je vous remercie par avance,

    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
    #include <stdio.h>
    #include <stdlib.h>
    main()
    {
     
     
    FILE* data1;
        long i, n1, n2, nval1, nval2;
        float tab1[n1], tab2[n2];
     
        /* Ouverture du fichier (en lecture texte) : */
         data1 = fopen( "data.txt", "r") ;
     
        if ( data1==NULL )
        {
            printf("\n\n erreur d'ouverture des fichiers :");
            exit(0);
        }
        fscanf( data1, "%d", &n1 );
     
      for ( i=0 ; (i<n1)&&(!feof(data1)) ; i ++ )
            fscanf( data1, "%d%f", &nval1, &tab1[i] );
     
            printf("\n\n Voici les valeurs lues dans le fichier :");
     
        for (i=0; i<n1; i ++)
            printf( "%d%f", i, tab1[i] );
     
            fclose( data1 );

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Vu ton code, il semblerait que le fichier contienne un premier nombre isolé sur une ligne, puis ensuite chaque ligne contient un int et un float. Tu confirmes ?
    Accessoirement feof() n'a pas pour but de détecter une fin de fichier. Ca la détecte oui mais comme ce n'est pas son but premier, l'utiliser pour ça amène des soucis d'algo que tu n'aurais pas si tu utilisais la bonne façon de faire (ie vérifier le nombre d'éléments lus durant la lecture)...

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour
    Vu ton code, il semblerait que le fichier contienne un premier nombre isolé sur une ligne, puis ensuite chaque ligne contient un int et un float. Tu confirmes ?
    Accessoirement feof() n'a pas pour but de détecter une fin de fichier. Ca la détecte oui mais comme ce n'est pas son but premier, l'utiliser pour ça amène des soucis d'algo que tu n'aurais pas si tu utilisais la bonne façon de faire (ie vérifier le nombre d'éléments lus durant la lecture)...
    Bonjour Sve@r,
    Je vous remercie, on fait le fichier contient une mesure chaque ligne :
    22.9411
    22.9411
    22.9405
    22.9402
    22.9396
    22.939
    22.939
    22.939

    j'ignore le nombre de ligne et c'est variable à chaque mesure.
    j'ai retiré foef(), le problème persiste

    Nom : Capture d'écran 2023-11-19 162726.png
Affichages : 122
Taille : 25,2 Ko

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mironim Voir le message
    le fichier contient une mesure chaque ligne :
    22.9411
    22.9411
    22.9405
    22.9402
    22.9396
    22.939
    22.939
    22.939
    Une info par ligne ? Alors pourquoi 1) commencer par lire un %d initial puis 2) lire un %d et %f (donc 2 infos) à chaque ligne ???

    Citation Envoyé par mironim Voir le message
    j'ai retiré foef(), le problème persiste
    Bien évidemment !!! Il ne convient pas mais le besoin (détecter la fin de fichier) persiste. Donc le retirer implique de le remplacer par autre chose (et de préférence par autre chose plus adapté) sinon il est évident que ça ne marchera pas mieux (et en réalité ça marchera moins bien)...

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float f;
    while (fscanf(data1, "%f", &f) == 1)
    	printf("f=%f\n", f);

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie, là ça marche, déjà j'ai affiché les valeurs du fichier d'origine, sauf pour les mettre dans un tableau tab1, j'ai rajouté ces lignes à la boucle while mais ça bloque au bout de 6 valeurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (fscanf(data1, "%f", &f) == 1)
    {   tab1[n1]=f;
        printf("f=%f\n", f);
        n1++;
    }

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mironim Voir le message
    j'ai rajouté ces lignes à la boucle while mais ça bloque au bout de 6 valeurs
    Si ça bloque au bout de 6 valeurs soit
    1) il n'y a pas plus de 6 valeurs
    2) il y a un truc qui gêne dans le fichier
    Mais moi ton exemple de 8 valeurs je le lis parfaitement.
    Et pas besoin de passer par "f", autant remplir directement le tableau... while (fscanf(data1, "%f", &tab1[n1++]) == 1); (on admettra que n1 commence à 0 car ce n'est pas écrit dans ton exemple).

    PS: à propos de n1 justement, je viens de relire ton code d'origine. Tu es sûr de toi quand tu écris float tab1[n1] ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Si ça bloque au bout de 6 valeurs soit
    1) il n'y a pas plus de 6 valeurs
    2) il y a un truc qui gêne dans le fichier
    Mais moi ton exemple de 8 valeurs je le lis parfaitement.
    Et pas besoin de passer par "f", autant remplir directement le tableau... while (fscanf(data1, "%f", &tab1[n1++]) == 1); (on admettra que n1 commence à 0 car ce n'est pas écrit dans ton exemple).

    PS: à propos de n1 justement, je viens de relire ton code d'origine. Tu es sûr de toi quand tu écris float tab1[n1] ?
    sincèrement non je ne suis pas sûr, mais la précision est bonne car votre code fonctionne bien sauf qu'il faut remplir le tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float f;
    while (fscanf(data1, "%f", &f) == 1)
    	printf("f=%f\n", f);

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mironim Voir le message
    sincèrement non je ne suis pas sûr
    C'était une question pour la forme. Tu as dû apprendre le C en général et les tableaux en particulier. On ne t'a pas dit quelque part qu'un tableau devait avoir une taille définie à l'avance ?
    Donc écrire float tab[n] avec "n" variable contenant une valeur indéterminée c'est tout sauf une taille définie.

    Tu peux aussi faire remplir n et ensuite écrire float tab[n]. C'est ce qu'on appelle les "VLA" (Variable Length Array=tableaux de longueur variable) mais c'est tout sauf sécurisé (si ça marche pas tu n'es pas prévenu). Pour un petit truc rapide c'est bon mais si tu en prends l'habitude ça te pétera à la figure un jour ou l'autre.

    Pour un tableau devant stocker des éléments dont la cardinalité n'est pas prévisible tu peux
    • soit partir de l'hypothèse que tu n'auras jamais plus de 1000 (2000, 3000, ...) éléments et définir un tab[1000] (2000, 3000, ...). Les #define peuvent t'aider à centraliser la taille.
    • soit faire de l'allocation dynamique : tu alloues "n", et tu remplis. Et quand la taille remplie arrive à "n" tu réalloues 2n et etc.


    Et si la cardinalité n'est pas prévisible mais calculable, alors tu peux commencer par la calculer (ici c'est le nombre de lignes du fichier) puis faire une allocation de cette taille avant de relire le fichier pour remplir le tableau.

    Autre question pour la forme: en théorie tu as rarement besoin de stocker un fichier dans un tableau (ben oui, tu as déjà le fichier que tu peux lire et relire tant que tu en as envie). Donc pourquoi ici tu as besoin de stocker les valeurs ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je vous remercie pour ces informations et conseils.
    Je souhaite stocker le tableau d'abord pour vérifier la bonne lecture des données et l'utiliser et faire des calculs par la suite et générer d'autres tableaux, mais effectivement je peux y accéder à chaque calcul.
    Autre question pour la forme: en théorie tu as rarement besoin de stocker un fichier dans un tableau (ben oui, tu as déjà le fichier que tu peux lire et relire tant que tu en as envie). Donc pourquoi ici tu as besoin de stocker les valeurs ?
    J'ai suivi votre conseil et j'ai utilisé deux appels à fscanf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    n1=0;
    while (fscanf(data1, "%f", &f) == 1)
    {
        n1++;
    }
    const nval=n1;
    float tab1[nval];
    while (fscanf(data1, "%f", &tab1[n1++]) == 1);
    for (i=0; i<nval; i ++) printf( "%f\n", tab1[i]);
    le nombre des valeurs lues est bon, par contre sur tab1 je ne récupère pas les bonnes valeurs, je crois j'ai un problème de conversion

  10. #10
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 737
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 737
    Points : 31 065
    Points
    31 065
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mironim Voir le message
    le nombre des valeurs lues est bon, par contre sur tab1 je ne récupère pas les bonnes valeurs, je crois j'ai un problème de conversion
    Tu as lu le fichier pour compter les datas, la tête de lecture se trouve donc à la fin (logique non ? si tu sors de la première boucle parce que tu n'as plus rien à lire, tu n'as toujours rien à lire lorsque la seconde boucle commence).
    Il te faut donc te replacer au début pour pouvoir le relire et les récupérer les datas dans le tableau => fseek(data1, 0, SEEK_SET).

    Et (avis totalement personnel) nommer une variable fichier "data1" c'est peu parlant. Généralement on a un consensus plus orienté vers des noms style "fp_truc" (fp=File Pointer). Mais ça reste un avis totalement personnel et partial.

  11. #11
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 676
    Points : 1 710
    Points
    1 710
    Par défaut
    .... et mettre n1 à zéro avant le while() ligne 9

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Tu as lu le fichier pour compter les datas, la tête de lecture se trouve donc à la fin (logique non ? si tu sors de la première boucle parce que tu n'as plus rien à lire, tu n'as toujours rien à lire lorsque la seconde boucle commence).
    Il te faut donc te replacer au début pour pouvoir le relire et les récupérer les datas dans le tableau => fseek(data1, 0, SEEK_SET).

    Et (avis totalement personnel) nommer une variable fichier "data1" c'est peu parlant. Généralement on a un consensus plus orienté vers des noms style "fp_truc" (fp=File Pointer). Mais ça reste un avis totalement personnel et partial.
    c'est bon ça marche il manquait fseek !!
    Je vous remercie j'ai bien appris des choses avec vous
    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/07/2014, 09h58
  2. Créer une base de données à partir d'un fichier .dmp
    Par funboard dans le forum Import/Export
    Réponses: 1
    Dernier message: 08/12/2008, 18h14
  3. Réponses: 1
    Dernier message: 14/05/2008, 18h02
  4. [Conception] Alimenter une base de données à partir d'un fichier texte
    Par gharbi5 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/10/2007, 14h12
  5. Réponses: 3
    Dernier message: 29/03/2006, 15h23

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