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 d'un fichier pour extraire des informations


Sujet :

C

  1. #1
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut Lecture d'un fichier pour extraire des informations
    Bonjour,
    J'ai un fichier qui contient des enregistrements
    mais le problème que ces enregistrements ne sont pas fixes.

    Exemple d'un fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0  0  4  6  2  4
    1  6  7  8  3
    2  8  9  0  6  5  7
    Les 4 premiers identifiants de chaque ligne sont fixes mais le reste peut varier.
    Comment pourrais je lire les informations de chaque ligne pour les stocker dans une structure?
    Est ce qu'il y'a un test en C sur le 'end of line' ?
    The great glory is not in never falling but in rising every time we fall.

  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
    La stratégie que j'utiliserais, si les lignes ne sont pas trop longues, c'est de lire le fichier ligne par ligne avec fgets(), récupérer chaque entrée avec strtok(), puis convertir en entier avec strtol().

    Sinon, une lecture caractère par caractère avec fgetc() peut convenir. Pour tester la fin de ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int c;
     
    c= fgetc(mon_fichier);
    if (c == '\n')
    {
       /* ... */
    }
    Fais de ton mieux et poste ton code. Pose des questions précises si tu ne comprends pas. Tu trouveras la documentation pour les fonctions mentionnées ci-dessus ici: http://man.developpez.com

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut
    voila ce que j'ai fait en premier lieu pour afficher mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    while(!feof(FICHIER))
    {
    c=fgetc(FICHIER);
    switch(c)
     {
       case '\n' : printf("\n"); break;
       case '\t' : printf("\t"); break;
       default  : printf("%c",c)
     }
     
    }
    Mais à la fin le programme m'affiche un point d'interrogation "?"
    je ne sais pas quel caractère il est en train d'afficher.

    Ce que je veux faire c'est lire le fichier ligne par ligne et stocker chaque ligne dans une structure de la forme suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct node{
    int node_id;
    int x,y,z;
    int tab_voisins;
    }
    Pourriez vous me guider un peu !
    The great glory is not in never falling but in rising every time we fall.

  4. #4
    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 condor_01 Voir le message
    voila ce que j'ai fait en premier lieu pour afficher mon fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while(!feof(FICHIER))
    {
    c=fgetc(FICHIER);
    switch(c)
     {
       case '\n' : printf("\n"); break;
       case '\t' : printf("\t"); break;
       default  : printf("%c",c)
     }
    }
    Mais à la fin le programme m'affiche un point d'interrogation "?"
    je ne sais pas quel caractère il est en train d'afficher.
    Normal, feof() ne fait pas ce que tu crois. Il faut utiliser la valeur retournée par la fonction de lecture. Je suggère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       while ((c = fgetc(fichier)) != EOL)
       {
          /* traitement de c */
       }
    Ce que je veux faire c'est lire le fichier ligne par ligne et stocker chaque ligne dans une structure de la forme suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct node{
    int node_id;
    int x,y,z;
    int tab_voisins;
    }
    Pourriez vous me guider un peu !
    Il faut lire le fichier ligne par ligne avec fgets(), puis extraire les données de chaque ligne avec sscanf() (format en fonction du numéro de ligne) et ranger les données dans la structure au fur et à mesure...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut
    Mon problème c'est que les formats de ligne ne sont pas fixes.
    Le nombre d'entiers qui existent dans chaque ligne est variable. Donc je ne peux pas savoir combien d'entiers dans chaque ligne !!
    The great glory is not in never falling but in rising every time we fall.

  6. #6
    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
    Si tu connais la longueur max d'une ligne, tu lis ton fichier ligne par ligne avec fgets() et tu utilises ensuite strtol() pour la conversion des entiers, un par un.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut
    Et si je ne connais pas la longueur max de chaque ligne ?
    Une autre question
    J'ai des tabulations comme séparateur entre les entiers; Est ce que "fgets" renvoie le chaîne avec ou sans les tabulations ??
    The great glory is not in never falling but in rising every time we fall.

  8. #8
    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 condor_01 Voir le message
    Et si je ne connais pas la longueur max de chaque ligne ?
    Peux-tu au moins évaluer une taille raisonnable ? (1024, 2048...)

    Si c'est trop incertain, il faut travailler en dynamique. Le mieux est alors d'écrire une fonction de lecture de ligne souple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char *fget_line (FILE *fp);
    créée avec malloc() qui s'agrandit au fur et à mesure des besoins (tant qu'on a pas trouvé le \n) avec realloc(). Il est d'usage de multiplier la taille à chaque fois par le nombre d'or (ou 2, qui est son approximation entière la plus proche).
    Une autre question
    J'ai des tabulations comme séparateur entre les entiers; Est ce que "fgets" renvoie le chaîne avec ou sans les tabulations ??
    Avec. Le blancs ne sont pas interprétés. Il y a 3 critères qui interrompent fgets() :
    • La fin de lecture (fgets() renvoie NULL)
    • La lecture d'un '\n' (la ligne lue est terminée par un '\n')
    • Le tableau de lecture est plein (la ligne lue n'est pas terminée par un '\n')
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut
    Bonjour,
    J'ai commencé par faire cette boucle pour vérifier le fonctionnement de fgets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof(FICHIER))
        {     
    	 fgets(chaine,sizeof(chaine),FICHIER);
    	 printf("%s \n", chaine);       
        }
    Mais le problème que la dernière ligne s'est affiché 2 fois !!
    et il y'a une ligne vide qui s'affiche après chaque ligne aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    0	0	0	0
     
    1	5	0	0
     
    2	5	5	0
     
    3	8	5	0
     
    4	11	5	0
     
    4	11	5	0
    The great glory is not in never falling but in rising every time we fall.

  10. #10
    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
    Le problème vient de feof() qui ne fonctionne pas comme tu le penses. En effet, cette fonction retourne vrai si la fin de fichier a été lue par fgets(). Ainsi, lorsque fgets() lit la dernière ligne du fichier, il la place dans le tampon chaine et renvoie l'adresse de chaine. A ce stade, feof() retourne faut, car EOF n'a pas encore été lu. Ainsi, la boucle fait encore un tour. Le prochain appel de fgets() rencontre la fin de fichier. Ancun caractère n'est lu et la valeur NULL est renvoyée. Le contenu de chaine reste inchangé, mais sera tout de même affichée une seconde fois. C'est la raison pour laquelle tu obtient deux fois la dernière ligne.

    Citation Envoyé par condor_01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof(FICHIER))
        {     
    	 fgets(chaine,sizeof(chaine),FICHIER);
    	 printf("%s \n", chaine);       
        }
    La façon correcte de procéder est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (fgets(chaine, sizeof chaine, FICHIER) != NULL)
    {
        /* -tc- Pour en savoir plus sur fclean(), fais une recherche dans les
            archives du forum C */
        fclean(chaine, FICHIER);
        printf("%s \n", chaine);
    }
    Thierry
    }
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  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 condor_01 Voir le message
    Bonjour,
    J'ai commencé par faire cette boucle pour vérifier le fonctionnement de fgets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while (!feof(FICHIER))
        {     
    	 fgets(chaine,sizeof(chaine),FICHIER);
    	 printf("%s \n", chaine);       
        }
    Mais le problème que la dernière ligne s'est affiché 2 fois !!
    A quoi ça sert que je donne des explications si les mêmes erreurs sont répétées encore et encore ?

    http://www.developpez.net/forums/sho...27&postcount=4
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre habitué Avatar de condor_01
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    294
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 294
    Points : 133
    Points
    133
    Par défaut
    Je suis désolé si j'ai pas bien compris.
    Excusez mon inattention.
    C'est grâce à vous que j'apprends.
    Pour le moment j'ai fait tourné mon programme
    Merci bcp
    The great glory is not in never falling but in rising every time we fall.

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

Discussions similaires

  1. Aide pour extraire des informations d'un planning
    Par hvegung dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/07/2015, 11h50
  2. Réponses: 19
    Dernier message: 21/03/2012, 16h17
  3. Réponses: 1
    Dernier message: 08/05/2011, 03h48
  4. [CLI] Attaquer la base de données SVN pour extraire des informations
    Par Gowser12 dans le forum Subversion
    Réponses: 2
    Dernier message: 09/01/2009, 11h57
  5. Réponses: 8
    Dernier message: 13/07/2006, 01h17

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