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 :

Problème avec fgets() et strlen()


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 Problème avec fgets() et strlen()
    Bonjour,
    J'ai un fichier qui a ce format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    0   1   6   9
    1   10   1
    2   19   20   3
    Le séparateur est une tabulation et le nombre d'entiers dans chaque ligne n'est pas fixe.
    Ce que je veux faire c'est de lire le fichier ligne par ligne et récupérer le nombre d'entiers.
    Donc je dois avoir : ligne1 = 4 , ligne2 = 3 , ligne3 = 4
    J'ai essayé avec fgets() combiné à strlen() mais ça ne me donne pas le bon compte parce strlen donne le nombre de caractères càd que l'entier "19" est compté 2 fois.
    En plus de ça j'ai le problème de la tabulation.
    Pourriez vous m'orienter?
    Merci
    The great glory is not in never falling but in rising every time we fall.

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Bonjour,

    Comme ca je dirais, que tu lis ligne par ligne avec fgets(), comme tu as fait. Pour chaque ligne lue, tu la découpes grace à la fonction strtok() avec comme séparateur le caractère de tabulation. Tu comptes le nombre de sous chaine obtenue pour la ligne donnée et tu obtiens ton nombre d'entiers par ligne.

    Exemple d'utilisation de strtok(), issue de la MSDN:
    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
     
    Example
     
    /* STRTOK.C: In this program, a loop uses strtok
     * to print all the tokens (separated by commas
     * or blanks) in the string named "string".
     */
     
    #include <string.h>
    #include <stdio.h>
     
    char string[] = "A string\tof ,,tokens\nand some  more tokens";
    char seps[]   = " ,\t\n";
    char *token;
     
    void main( void )
    {
       printf( "%s\n\nTokens:\n", string );
       /* Establish string and get the first token: */
       token = strtok( string, seps );
       while( token != NULL )
       {
          /* While there are tokens in "string" */
          printf( " %s\n", token );
          /* Get next token: */
          token = strtok( NULL, seps );
       }
    }

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, tu peux utiliser strtod, qqch du genre (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    while(fgets(line,sizeof line,file)!=NULL)
    {
     p=line,
     i=0;
     while(p!=0)
     {
      tab[i]=strtod(p,&p);
      i++
     }
    }

  4. #4
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    J'aurais également utiliser strtok (si tu n'es pas dans un contexte multithreadé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    fgets(...);
     
    /* verification fgets + fclean */
     
    int nb = 0;
    char *p = strtok(buffer, "\t");
     
    while(p != NULL)
    {
        nb++;
        p = strtok(NULL, "\t");
    }
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je pense que tu vas toujours repartir du même endroit... Il doit manquer un p++ quelque part... Manque un ';' ...
    Je n'ai pas bien compis le p++. Voici mon précédent code corrigé (avec le ';')

    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
     
    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
     
    int main(void)
    {
      /* on suppose que line est le resultat d'un precedent fgets() */
      char line[30]="1 4 7	-4", *p;
      int i=0, tab[4];
     
      p=line;
     
      while(*p!='\0')
      {
        tab[i]=strtod(p,&p);
    	i++;
      }
     
      for(i=0;i<4;++i) printf("%d\n",tab[i]);
     
      return 0;
    }

  6. #6
    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 salseropom Voir le message
    Je n'ai pas bien compis le p++. Voici mon précédent code corrigé (avec le ';')
    OK, c'est bon. strtod() fait bien ce qu'il faut... Je pensais à un autre fonction... Bref, je me suis planté...
    Pas de Wi-Fi à la maison : CPL

  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
    Je vous remercie tous pour vos réponses pertinentes
    Le problème a été réglé.
    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. Problème avec fgets
    Par kadd18 dans le forum C
    Réponses: 3
    Dernier message: 28/07/2009, 19h58
  2. Probléme avec fgets
    Par Lucas42 dans le forum C
    Réponses: 2
    Dernier message: 18/11/2007, 03h08
  3. Problème avec fgets
    Par fabpeden dans le forum C
    Réponses: 13
    Dernier message: 15/05/2007, 10h25
  4. problème avec fgets
    Par salseropom dans le forum C
    Réponses: 1
    Dernier message: 03/08/2006, 14h54
  5. Problème avec fgets et tube...
    Par tchingoo dans le forum POSIX
    Réponses: 5
    Dernier message: 22/08/2003, 17h03

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