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 :

Récupération de couple de valeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut Récupération de couple de valeur
    Bonjour,

    j'ai un fichier de ce type par exemple(le nombre de ligne n'est pas connue à l'avance)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    134.154.6.2,276.143.76.65
    165.212.243.54,127.54.9.5
    206.165.232.18,65.143.123.221
    j'ai écrit ce code pour lire le fichier et afficher le couple mais il n'est pas correct
    J'aurais besoin d'aide pour le compléter
    Merci


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
     
    #define F "fichier"
     
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
     
    typedef struct {
      char *duoIP[2];
    } t_couple;
     
     
    int main(void)
    {
      int nb = 0 ,size = 5;
      FILE *fp = fopen("voisin","r");
     
      t_couple *tabCouple;
      tabCouple = (t_couple*)malloc(sizeof(t_couple));
      if(tabCouple == NULL)
        {
          printf("erreur allocation\n");
          exit(1);
        }
     
      if (fp != NULL)
        {
          char line[BUFSIZ];
     
          while (fgets(line, sizeof line, fp) != NULL)
    	{
    	  clean(line, fp);
    	  char *p = line;
    	  if(nb == size)
    	    {
    	      size += 16;
     
    	      tabCouple = realloc(tabCouple, size * sizeof(t_couple));
    	      if (tabCouple == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	    }
     
    	  int ip1[4],ip2[4];
    	  int n = sscanf(p, "%d.%d.%d.%d,%d.%d.%d.%d", ip1, ip1 + 1, ip1 + 2, ip1 + 3, ip2, ip2 + 1, ip2 + 2, ip2 + 3);
    	  if(n == 9)
    	    {
    	      tabCouple[nb].duoIP[0] = malloc((strlen(ip1)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[0] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      strcpy(tabCouple[nb].duoIP[0],p);
     
    	      tabCouple[nb].duoIP[1] = malloc((strlen(ip2)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[1] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      strcpy(tabCouple[nb].duoIP[1],p);
     
    	      nb++;
    	    }
    	  else
    	    {
    	      printf ("format error\n");
    	      break;
    	    }
    	}
          fclose (fp), fp = NULL;
        }
      else
        {
          perror (F);
        }
      assert (fp == NULL);
     
      int i;
      for(i=0; i<nb; i++)
        printf("couple : %s et %s\n", tabCouple[i].duoIP[0], tabCouple[i].duoIP[1]);
     
      return 0;
    }

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Faudrait-il regarder les warnings d'abord non?
    test.c: In function 'main':
    test.c:76: warning: passing argument 1 of 'strlen' from incompatible pointer type
    test.c:85: warning: passing argument 1 of 'strlen' from incompatible pointer type
    Jc

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par fearyourself
    Faudrait-il regarder les warnings d'abord non?

    Jc
    Bonjour,

    Comment est-ce qu'on convertit un entier en chaine de caractère?

  4. #4
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Premium
    Bonjour,

    Comment est-ce qu'on convertit un entier en chaine de caractère?

    la fonction itoa de mémoire

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par gnto
    Transtypage !!
    N'importe quoi.
    Bonjour,

    Comment est-ce qu'on convertit un entier en chaine de caractère?
    On utilise itoa ou sprintf.

    Jc

  6. #6
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    désolé j'ai modifé entre temps j'avais mal lu

  7. #7
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    134.154.6.2,276.143.76.65
    165.212.243.54,127.54.9.5
    206.165.232.18,65.143.123.221
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	  int n = sscanf(p, "%d.%d.%d.%d,%d.%d.%d.%d", ip1, ip1 + 1, ip1 + 2, ip1 + 3, ip2, ip2 + 1, ip2 + 2, ip2 + 3);
    	  if(n == 9)
    Pour commencer change la valeur par 8.

    En effet sscanf() te retourne le nombre d'items assignes. (pas francais ca).
    Ici tu as 8 fois "%d". Donc si le format de ton fichier est correct, sscanf() et retournera 8, et non 9.

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par Jack_serious
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    134.154.6.2,276.143.76.65
    165.212.243.54,127.54.9.5
    206.165.232.18,65.143.123.221
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	  int n = sscanf(p, "%d.%d.%d.%d,%d.%d.%d.%d", ip1, ip1 + 1, ip1 + 2, ip1 + 3, ip2, ip2 + 1, ip2 + 2, ip2 + 3);
    	  if(n == 9)
    Pour commencer change la valeur par 8.

    En effet sscanf() te retourne le nombre d'items assignes. (pas francais ca).
    Ici tu as 8 fois "%d". Donc si le format de ton fichier est correct, sscanf() et retournera 8, et non 9.
    Et la virgule comprise dans le fichier n'a pas à être lu ?

  9. #9
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Premium
    Et la virgule comprise dans le fichier n'a pas à être lu ?
    Si, elle va être lue. Mais si tu regardes le man de sscanf, tu pourras y lire :
    Ces fonctions renvoient le nombre d'éléments d'entrées correctement assignés.
    C'est à dire si tu préfères, dans un langage plus courant (et donc moins correct), le nombre de "%" qui seront correctement lus par sscanf.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  10. #10
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Premium
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char line[BUFSIZ];
     
    while (fgets(line, sizeof line, fp) != NULL)
    { 
    ...
    }
    BUFSIZ == sizeof line nan ?

  11. #11
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     typedef struct {
        char duoIP[2][16];
        int nbDuoIP;
      } t_couple;
    t'éviterais les allocations dynamiques

  12. #12
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Citation Envoyé par gnto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     typedef struct {
        char duoIP[2][16];
        int nbDuoIP;
      } t_couple;
    t'éviterais les allocations dynamiques
    Le problème est qu'on ne connait pas le nombre de ligne à l'avance

  13. #13
    Membre Expert Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Par défaut
    Citation Envoyé par Premium
    Le problème est qu'on ne connait pas le nombre de ligne à l'avance
    oui c'est donc pour ca que tu alloues dynamiquement juste le tableau de t_couple mais pas les double chaines d'IP
    je parle de ça

    en ça
    parceque tu sais qu'une adresse IP c'est 16 caracteres

  14. #14
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    J'ai mis des printfs un peu partout et ça m'indique que cette partie du code est fausse :
    Je n'ai pas l'affichage de sscanf ok
    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
    if(n == 8)
    	    {
    	      printf("sscanf ok\n");
    	      tabCouple[nb].duoIP[0] = malloc((strlen(line)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[0] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      printf("Copie1\n");
    	      strcpy(tabCouple[nb].duoIP[0],line);
     
    	      tabCouple[nb].duoIP[1] = malloc((strlen(p)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[1] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      printf("Copie2\n");
    	      strcpy(tabCouple[nb].duoIP[1],p);
     
    	      nb++;
    	    }

  15. #15
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    747
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 747
    Par défaut
    Alors j'ai modifié le code de sorte de pouvoir récupérer les 2 valeurs : la première est dans line, la seconde dans p.
    A l'execution, j'obtiens :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <assert.h>
     
    #define F "fichier"
     
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
     
    typedef struct {
      char *duoIP[2];
    } t_couple;
     
     
    int main(void)
    {
      int nb = 0 ,size = 5;
      FILE *fp = fopen("fichier","r");
     
      t_couple *tabCouple;
      tabCouple = (t_couple*)malloc(sizeof(t_couple));
      if(tabCouple == NULL)
        {
          printf("erreur allocation\n");
          exit(1);
        }
     
      if (fp != NULL)
        {
          char line[BUFSIZ];
     
          while (fgets(line, sizeof line, fp) != NULL)
    	{
    	  clean(line, fp);
    	  char *p = strtok(line, ",");
    	  if(p == NULL)
    	    {
    	      printf("erreur\n");
    	      exit(1);
    	    }
    	  *p = '\0';
    	  p++;
     
    	  if(nb == size)
    	    {
    	      size += 16;
     
    	      tabCouple = realloc(tabCouple, size * sizeof(t_couple));
    	      if (tabCouple == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	    }
     
    	  int ip1[4],ip2[4];
    	  int n = sscanf(p, "%d.%d.%d.%d,%d.%d.%d.%d", ip1, ip1 + 1, ip1 + 2, ip1 + 3, ip2, ip2 + 1, ip2 + 2, ip2 + 3);
    	  if(n == 8)
    	    {
    	      tabCouple[nb].duoIP[0] = malloc((strlen(line)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[0] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      strcpy(tabCouple[nb].duoIP[0],line);
     
    	      tabCouple[nb].duoIP[1] = malloc((strlen(p)+1) * sizeof(t_couple));
    	      if (tabCouple[nb].duoIP[1] == NULL)
    		{
    		  perror("erreur allocation\n");
    		  free(tabCouple); tabCouple = NULL;
    		  exit(1);
    		}
    	      strcpy(tabCouple[nb].duoIP[1],p);
     
    	      nb++;
    	    }
    	  else
    	    {
    	      printf ("format error\n");
    	      break;
    	    }
    	}
          fclose (fp), fp = NULL;
        }
      else
        {
          perror (F);
        }
      assert (fp == NULL);
     
      int i;
      for(i=0; i<nb; i++)
        printf("couple : %s et %s\n", tabCouple[i].duoIP[0], tabCouple[i].duoIP[1]);
     
      return 0;
    }

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

Discussions similaires

  1. Récupération de couple de valeur d'un même champ
    Par valorz dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/08/2014, 12h15
  2. Réponses: 12
    Dernier message: 02/03/2007, 11h33
  3. [Collection] Regrouper des couples clé/valeur
    Par webspeak dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 22/05/2006, 14h12
  4. Réponses: 7
    Dernier message: 11/02/2006, 00h05
  5. [JList] notion de clé, couple clé - valeur affichée
    Par guipom dans le forum Composants
    Réponses: 2
    Dernier message: 26/03/2005, 01h00

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