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 :

« unpack » à la Perl en C ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut « unpack » à la Perl en C ?
    Bonjour,

    Je dois lire un fichier de données au format texte.
    Les données sont au format fixe.

    Prenons l'exemple simpliste suivant.
    Mon fichier "month.txt" contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    0131Janvier
    0228Février
    0331Mars
    0430Avril
    0531Mai
    0630Juin
    0731Juillet
    0831Août
    0930Septembre
    1031Octobre
    1130Novembre
    1231Décembre


    1. numéro du mois : entier, long=2
    2. nombre de jours dans le mois : entier, long = 2
    3. nom du mois : chaine, long = 20


    En perl, si $line contient une ligne du fichier, je ferais cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ($id, $days, $month) = unpack ($line, "A2A2A*");
    Mais en C, comment faire ?

    Merci.

  2. #2
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    J'ai une solution, mais elle a une syntaxe un peu différente.

    C'est-à-dire que le format s'écrit avec la taille maximale devant le type de donnée, « 2A2AA » au lieu de « A2A2A* ».
    Le fait de ne pas mettre de taille maximale devant le type remplace 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
    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
     
    #include <stdio.h>
    #include <ctype.h>
    #include <stdarg.h>
    #include <string.h>
     
    void
    unpack (char *buf, char *format, ...)
    {
        va_list ap;
        char *s;
        int len;
        int maxstrlen = 0;
        int count;
     
        va_start(ap, format);
     
        while (*format != '\0')
        {
            switch (*format)
            {
            case 'A':
                /* String format */
                s = va_arg (ap, char *);
                len = strlen (buf);
                if (maxstrlen > 0 && len > maxstrlen)
                    count = maxstrlen;
                else
                    count = len;
                memcpy(s, buf, count);
                s[count] = '\0';
                buf += count;
                break;
     
            default:
                /* Track max str len */
                if (isdigit (*format))
                    maxstrlen = maxstrlen * 10 + (*format - '0');
            }
     
            if (! isdigit (*format))
                maxstrlen = 0;
     
            format++;
        }
     
        va_end (ap);
    }
     
    int
    chomp (char *s)
    {
        int chomped = 0;
     
        char *p = strchr (s, '\n');
        if (p != NULL)
        {
            *p = '\0';
            chomped = 1;
        }
        return chomped;
    }
     
    int
    main (void)
    {
        FILE *fp;
        char buf [100];
        char id [2+1], day [2+1], month [20+1];
     
        fp = fopen ("month.txt", "r");
        while (fgets (buf, 100, fp))
        {
            chomp (buf);
            unpack (buf, "2A2AA", id, day, month);
            printf ("> id='%s', day='%s', month='%s'\n", id, day, month);
        }
        fclose (fp);
     
        return 0;
    }
    Ce qui donne comme résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    > id='01', day='31', month='Janvier'
    > id='02', day='28', month='Février'
    > id='03', day='31', month='Mars'
    > id='04', day='30', month='Avril'
    > id='05', day='31', month='Mai'
    > id='06', day='30', month='Juin'
    > id='07', day='31', month='Juillet'
    > id='08', day='31', month='Août'
    > id='09', day='30', month='Septembre'
    > id='10', day='31', month='Octobre'
    > id='11', day='30', month='Novembre'
    > id='12', day='31', month='Décembre'
    Est-ce quelqu'un a mieux (je pense que ça ne doit pas être difficile!).
    Merci.

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

Discussions similaires

  1. « unpack » à la Perl en Java ?
    Par domiq44 dans le forum Langage
    Réponses: 5
    Dernier message: 31/01/2008, 13h57
  2. [Perl] unpack un pointeur
    Par genova dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2006, 13h08
  3. [langage] Comparer Perl avec d'autres langages comme C ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 10/08/2002, 23h52
  4. [réseaux] Bench en Perl pour avoir le débit entre 2 pc
    Par Frich dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 22/05/2002, 17h22
  5. [web] Cherche un conseil pour un livre perl-tk
    Par Anonymous dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 29/04/2002, 15h35

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