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 :

Tableau dynamique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut Tableau dynamique
    Bonjour,

    N'ayant jamais utilisé les fonctions malloc et tableau dynamique et liste chainée.

    J'ai un souci pour réaliser une fonction en C.

    J'au un fichier in, comme ci-dessous (faisant des milliers de lignes) :
    907;A1;50455366941100; 8:54:22;;
    907;A2;50592402661100; 8:54:22;;
    907;A2;5026460369; 8:54:23;;
    518;A1;50513426561100; 8:54:23;;
    L07;A3;50652151531100; 8:54:24;;
    Je voudrais réaliser des compteurs dynamique, pour écrire dans un fichier out.
    En autorisant le comptage en colonne[0] du type 907 et 518 mais pas du type L07.
    En autorisant le comptage en colonne[1] du type A1 et A2 mais pas du type A3.

    Pour avoir dans un fichier out ci-dessous :

    907 = 3 - Type A1 = 1 - Type A2 = 2
    518 = 1 - Type A1 = 1
    L07 = NON AUTORISE = 1 - Type A3 = NON AUTORISE = 1
    Pour éviter le coté rébarbatif.
    En délarant 1000 int (suivant le type de colonne[0] - 907 518 etc...)
    Fois 3 int (suivant le type de colonne[1] - A1 A2 etc...).
    Ce qui alourdirait le programme en nombre de lignes de code.

    Je voudrais de l'aide.

    Ci après mon code source C, avec un type de compteur :

    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
    /*----*/
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define MY_BUFSIZ       128
     
    FILE *fin,
         *fout;
     
    char  fnout[MY_BUFSIZ],
          l_buf[MY_BUFSIZ];
     
    int nbr_907_auto       =    0;
     
     
    void main(int argc,char *argv[])
    {
        if(argc != 3)
            printf("manque paramètre exe fic_in fic_out\n");
        if ((fin = fopen(argv[1], "r")) == NULL)
             printf("pb fic_in\n");
        if ((fout = fopen(argv[2], "w")) == NULL)
             printf("pb fic_out\n");
     
        for(;;)
        {
            memset((char *)&l_buf,0x00,MY_BUFSIZ);
            if(fgets((char *)&l_buf,MY_BUFSIZ,fin)==NULL)
                break;
            memset(fnout, 0x00, MY_BUFSIZ);
            strncpy(fnout, l_buf, 3);
            if(!strncmp(fnout, "907", 3))
            {            
                nbr_907_auto++;
            }
        }
        fprintf(fout, " client 907 : %6d\n", nbr_907_auto);
        exit(0);
    }
     
    /*----*/
    Merci de votre aide.

    Cbibi

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, vous devriez décrire ce que doit faire le programme, par exemple
    - ouverture du fichier in en lecture seule
    - tant qu'on n'a pas atteint la fin de fichier
    - lire une ligne
    - séparer chaque champ
    - si le premier champ est correct
    le comptabiliser
    - etc ... pour chaque champ
    - fermeture du fichier in
    - création du fichier out en écriture
    - écriture des résultats de comptage
    - fermeture du fichier out.

    Dans votre explication, il manque des détails, par exemple pourquoi 907 et 518 sont bons et pas L07 ? Je suppose qu c'est parcequ'il y a un 'L' au lieu d'un '9'.
    Donc, c'est ça qu'il faut décrire.
    Est-ce que la liste des codes (3 premiers caractères) est définie, ou à constituer au fur et à mesure?
    Etes-vous sûr qu'il faut utiliser la fonction memset() ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci.

    En faites pour l'histoire du 907 et 518 et L07.

    Je voudrais tester la valeur de la colonne[0] sans passer par un if.
    Du style ci-dessous :
    Si colonne[0] = '907' || colonne[0] = '518' then tracker='OK'
    else tracker = 'KO'

    Je pense qu'il faudrait que j'utilise la commande enum ?

    Pour le stockage des valeurs je pense qu'il faudrait que j'utilise un tableau avec 3 colonnes ?

    Puis je faire un tableau de 1 char avec 2 int ?

    Si quelqu'un peut me répondre.
    Merci d'avance.

    cbibi

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, vous pensez plus à la traduction que vous devrez faire qu'à ce que vous voulez dire.
    On ne "passe pas par un if".
    Avant de penser à la commande que vous aller utiliser, pensez à ce le programme doit faire.

    Pour la réponse à vos 3 questions, ça peut être oui pour les 3, non pour les 3 mais en fait aucune des ces questions ne devrait être posées.
    Ou alors, à titre d'exercice "Dans tel contexte, utilisez le mot clé enum".

  5. #5
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci d'avoir répondu.
    Désolé si cela n'est pas clair.

    J'ai une liste de valeur autorisé en colonne 0 présent dans un fichier in.
    Ma liste de valeur autorisé est d'environ 50 chiffre ou mot.
    Cette colonne 0 peut faire de 3 à 5 caractères.
    Style : 518-907-850-525-M00-K88-9999 etc...

    Pour éviter de fair une 50ène de condition dans un if.

    Je pense qu'il y a une meilleur solution.
    Mais je n'arrive pas à trouver ?

    Ci après le code C que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        for(;;)
        {
            memset((char *)&l_buf,0x00,MY_BUFSIZ);
            if(fgets((char *)&l_buf,MY_BUFSIZ,fic_in)==NULL)
                break;		
    		strncpy(num_client,l_buf, 3);
    		if( (!strcmp(num_client, "907")) || (!strcmp(num_client, "518")) )
                printf("%s client OK\n", num_client);
            else
                printf("%s client KO\n", num_client);
        }
    Si quelqu'un peut prendre quelques minutes de son temps, pour m'éclaicir.

    Merci.

  6. #6
    Invité
    Invité(e)
    Par défaut
    S'il s'agit d'un exercice, autant nous donner directement l'énoncé.
    Si vous voulez qu'on le fasse pour vous, autant nous donner le mail du professeur.
    Le fichier qui contient les données est un fichier au format CSV. Donc la première chose à faire est de lire les 4 champs de chaque ligne.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Septembre 2010
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 7
    Par défaut
    Merci à vous deux pour l'aide.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 08h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 16h43

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