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 :

Recherche de l'indice où débute une sous chaine dans un char*.


Sujet :

C

  1. #41
    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 funkyKong Voir le message
    La lecture séquentiel, c'est exactement ce que je cherche à éviter. Si je lit octet par octet, le fichier est lu en 8h (je l'avais testé)...
    Mon logicielle doit être executé en moins de 5 secondes.
    Le traitement des .emi doit être fait en 1s.
    Sur ma brouette (Celeron M80 à 1.3 Ghz)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    8371359 bytes read
    done in 1.312 s
     
    Press ENTER to continue.
    avec
    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
     
    #include<stdio.h>
     
    int main (void)
    {
       FILE *fp = fopen ("fichier.emi", "rb");
       if (fp != NULL)
       {
          unsigned long n = 0;
          int c;
          while ((c = fgetc (fp)) != EOF)
          {
             n++;
          }
          fclose (fp);
     
          printf ("%lu bytes read\n", n);
       }
       return 0;
    }
    Pour les tags à récupéré, je sais exactement où ils se trouvent via l'éditeur hexadecimal. Le problème c'est le temps que le programme doit mettre pour les récupérer.
    Je veut récupéré la valeur de quelques tags précis. Donc pour cela je dois repérer les tags name. Et c'est là le programme puisque la recherche de caractère ne fonctionne pas.
    Il est certain qu'une recherche de tag fonctionne en mode séquentiel.

    Brut de fonderie :
    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
     
    /* Le code manquant est ici : 
        http://delahaye.emmanuel.free.fr/clib/
     
        Notamment ed/src/sys.c pour SYS_dump()
    */
    #include "ed/inc/sys.h"
    #include<stdio.h>
     
    typedef unsigned long pos_t;
     
    int get_tag (char const *fname, char const *tag, pos_t * p_pos)
    {
       int found = 0;
       FILE *fp = fopen (fname, "rb");
       if (fp != NULL)
       {
          enum
          { STS_INIT, STS_IN, STS_OUT }
          sts = STS_INIT;
          size_t const tag_len = strlen (tag);
     
          unsigned long n = 0;
          int c;
          size_t i_tag = 0;
          pos_t pos = 0;
          while (!found && (c = fgetc (fp)) != EOF)
          {
             switch (sts)
             {
             case STS_INIT:
                if (c == tag[i_tag])
                {
                   pos = n;
                   i_tag++;
                   sts = STS_IN;
                }
                break;
             case STS_IN:
                if (c == tag[i_tag])
                {
                   i_tag++;
                   if (i_tag == tag_len)
                   {
                      found = 1;
     
                      if (p_pos != NULL)
                      {
                         *p_pos = pos;
                      }
                   }
                }
                else
                {
                   i_tag = 0;
                   sts = STS_OUT;
                }
                break;
             case STS_OUT:
                if (c == tag[i_tag])
                {
                   pos = n;
                   i_tag++;
                   sts = STS_IN;
                }
                break;
             }
             n++;
          }
          fclose (fp);
     
          printf ("%lu bytes read\n", n);
       }
       else
       {
          perror (fname);
       }
       return found;
    }
     
    void fdump (char const *fname, pos_t pos, size_t len)
    {
       FILE *fp = fopen (fname, "rb");
       if (fp != NULL)
       {
          char *data = malloc (len);
          if (data != NULL)
          {
             fseek (fp, pos, SEEK_SET);
             fread (data, len, 1, fp);
             fclose (fp);
     
             SYS_dump (data, len);
             free (data);
          }
       }
       else
       {
          perror (fname);
       }
    }
     
    int main (void)
    {
       char const *fname = "fichier.emi";
       char const *tag = "Acquire HAADF";
       pos_t pos;
       int found = get_tag (fname, tag, &pos);
       if (found)
       {
          fdump (fname, pos, 32);
       }
       else
       {
          printf ("The '%s' tag was not found\n", tag);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    511 bytes read
    003D2488 41 63 71 75 69 72 65 20 48 41 41 44 46 20 53 63  'Acquire HAADF Sc'
    003D2498 61 6E 6E 69 6E 67 20 44 69 73 70 6C 61 79 31 20  'anning Display1 '
    done in 0 s
     
     
    Press ENTER to continue.
    Ultime test avec le fichier complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    8390654 bytes read
    003D2488 43 61 6D 65 72 61 20 6C 65 6E 67 74 68 3C 2F 4C  'Camera length</L'
    003D2498 61 62 65 6C 3E 3C 56 61 6C 75 65 3E 30 2E 31 32  'abel><Value>0.12'
    done in 1.437 s
     
    Press ENTER to continue.
    Franchement, l'algo qui met 8h à lire 8Mo, j'y crois pas...
    Pas de Wi-Fi à la maison : CPL

  2. #42
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    Sur ma brouette (Celeron M80 à 1.3 Ghz)



    Il est certain qu'une recherche de tag fonctionne en mode séquentiel.
    ca je suis complétement d'accord. Quand j'affiche un caractère du buffer, le caractère affiché est bien bon. Le problème, c'est que cela va prendre trop de temps (alors que cela doit prendre moins de 3s)

  3. #43
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Bon, j'ai bien reçu ton fichier et il était effectivement différent (tu avais du l'uploader en mode ascii)...

    J'ai relancer le même programme de test que précédemment et voici l'output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'Camera' found in file at pos 8390648
    Donc, le code que je t'ai donné fonctionne correctement. Maintenant, il n'est pas forcément adapté à une série de 20 tags...

    Il faut donc modifier le bazar pour tester tous les tags lors d'un seul parcours.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #44
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    vicenzo ton code ne compile pas sous visual C++ 2003

    buf = malloc(size);
    error C2440: '=' : cannot convert from 'void *' to 'char *'

  5. #45
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    En C++ tu dois caster le retour de malloc(), ce qui n'est pas nécessaire en C...

    Allez, encore une remarque comme celle la et je déplace le topic dans la rubrique C++ !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #46
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    En C++ tu dois caster le retour de malloc(), ce qui n'est pas nécessaire en C...
    je viens de l'apprendre.

    Il est vrai qu'il est loin le temps où j'ai programmé en C et non en C++ (non ne déplace pas )

    Effectivement lorsque j'avais psoté ma remarque j'avais déja casté

  7. #47
    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 funkyKong Voir le message
    Effectivement lorsque j'avais psoté ma remarque j'avais déja casté

    j'ai plus qu'à racheter un clavier... merci...
    Pas de Wi-Fi à la maison : CPL

  8. #48
    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 funkyKong Voir le message
    vicenzo, je t'ai envoyé les fichiers
    Euh, on pue des pieds ?

    Je rappelle que c'est un forum public (well, sort of...)
    Pas de Wi-Fi à la maison : CPL

  9. #49
    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 funkyKong Voir le message
    Le problème, c'est que cela va prendre trop de temps (alors que cela doit prendre moins de 3s)
    Bah, prouve-le.
    Pas de Wi-Fi à la maison : CPL

  10. #50
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    Donc, le code que je t'ai donné fonctionne correctement. Maintenant, il n'est pas forcément adapté à une série de 20 tags...

    Il faut donc modifier le bazar pour tester tous les tags lors d'un seul parcours.
    Merci ! Je viens de tester. En effet cela fonctionne à merveille.
    Je vais maintenant l'optimiser pour gérer plusieurs tags, cherche les tags values de mes tags name et rendre un peu plus C++ le code que tu as fait



    Citation:
    Envoyé par funkyKong Voir le message
    Effectivement lorsque j'avais psoté ma remarque j'avais déja casté
    j'ai plus qu'à racheter un clavier... merci...
    oups désolé




    Citation:
    Envoyé par funkyKong Voir le message
    vicenzo, je t'ai envoyé les fichiers
    Euh, on pue des pieds ?
    Je rappelle que c'est un forum public (well, sort of...)
    Si je lui ai envoyé par mail c'est que quand je l'avais uploader le fichier était mal passé. Ca pose aucun problème de le mettre en public.


    Citation:
    Envoyé par funkyKong Voir le message
    Le problème, c'est que cela va prendre trop de temps (alors que cela doit prendre moins de 3s)
    Bah, prouve-le.
    J'ai plus le code sous la main là mais j'avais testé cela il y a quelques temps. Et je t'assure que la lecture octet par octet était trés trés longue.



    Bon en tout cas un Grand Merci à tous pour votre aide géniale notamment à vicenzo, Emmanuel et souviron34

    Grâce à vous je n'ai plus ce bug.

    Encore merci

  11. #51
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    Bon, je viens de comprendre d'où venais l'erreur dans ce que j'avais implémenter et c'était minable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    str = my_strstr(buf, tag, size);
    Je ne passais pas en paramètre la taille totale du buffer mais juste la taille du char * tag.

  12. #52
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Euh, on pue des pieds ?
    Je n'osais pas te le dire... Enfin me voila soulagé !

    En fait je lui ai proposé de m'envoyer le ficier par mail car l'upload sur le ftp free avait fouaré...

    Mais je peux te l'envoyer si tu veux (mais avant tu montre patate toute propre et blanche !)
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  13. #53
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par vicenzo Voir le message
    Comment tu détermines la valeur de paramètre 'size' que tu passes à la fonction ?
    Je t'avais pourtant mis sur la piste !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  14. #54
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 49
    Points : 11
    Points
    11
    Par défaut
    Je t'avais pourtant mis sur la piste !
    Je sais bien. Cela crains d'autant plus

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. rechercher une sous chaine dans une chaine
    Par id.prog dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 25/01/2009, 18h59
  2. Rechercher une sous chaine dans un chaine
    Par franck06 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 15h53
  3. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 14h46
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 11h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 15h39

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