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. #1
    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 Recherche de l'indice où débute une sous chaine dans un char*.
    Bonjour,

    J'ai un bug lorsque je recherche l'indice où débute une sous chaine dans un char*.

    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
     
     
    int getIndStrStr (const char *cs, const char *ct) {
    	int index = -1;
     	if (cs != NULL && ct != NULL) {
    		char *ptr_pos = NULL;
    		ptr_pos = strstr (cs, ct);
    		if (ptr_pos != NULL) {
    			index = ptr_pos - cs;
    		}
    	}
    	return index;
    }
     
     
     
    void MaFct() {
         .....
         ........
         char * bufferFichier = new char[size];
         f_in.read(bufferFichier,size);
     
         int ind = getIndStrStr (bufferFichier, "Camera");
         cout  <<  endl << "Enfin voici l'indice => " << ind << endl;
     
    }
    La valeur affiché est -1.
    Cela vient du fait qu'il ne trouve pas "Camera" dans mon buffer (le buffer étant bien rempli).


    Or j'ai écrit ce bout de code pour vérifier que le buffer contient bien la chaine "Camera" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cout <<  endl << "Buffer fichier: " << bufferFichier[8390648] << bufferFichier[8390649] << bufferFichier[8390650] << bufferFichier[8390651] << bufferFichier[8390652] << bufferFichier[8390653]  << endl;
    La valeur affiché ici est bien Camera.

    Je ne comprend pas....

    Merci d'avance,
    funky

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    La fonction getIndStrStr est correcte.
    Cela vient du fait qu'il ne trouve pas "Camera" dans mon buffer (le buffer étant bien rempli).
    Peut être un '\0' traine dans le buffer avant la sous-chaîne "Camera" ?

    Or j'ai écrit ce bout de code pour vérifier que le buffer contient bien la chaine "Camera" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout <<  endl << "Buffer fichier: " << bufferFichier[8390648] << bufferFichier[8390649] << bufferFichier[8390650] << bufferFichier[8390651] << bufferFichier[8390652] << bufferFichier[8390653]  << endl;
    La valeur affiché ici est bien Camera.
    Ce code n'est pas du C mais du C++
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    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
    Ce code n'est pas du C mais du C++
    oups désolé pour le cout. Je code en C++ mais je suis obliger de passer par des char* donc d'utiliser la biblio standard du C. C'est pour cela que j'ai posté ce message dans le forum C.

    Merci en effet aprés vérification, il y a bien un \0 avant "Camera"
    donc cela est sans doute une partie du problème.
    Mais alors comment faire ?

    Mais ce n'es pas le seul problème.
    Quand je teste en mettant "Scanning Acquire" (c'est au tout début du buffer - donc pas de \0 avant) cela renvoie toujours -1.


    Merci d'avance

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Merci en effet aprés vérification, il y a bien un \0 avant "Camera"
    donc cela est sans doute une partie du problème.
    Mais alors comment faire ?
    tout simplement en faisant une version un peu modifiée de strstr() qui prend en paramètre la taille du buffer qui sera testée en lieu et place du zéro terminal.

    voici le strstr() de Microsoft rapidement modifié comme indiqué (pas testé... mais bon...):

    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
     
    char * my_strstr (const char * str1, const char * str2, size_t size)
    {
            char *cp = (char *) str1;
            char *s1, *s2;
            size_t n;
     
            if ( !*str2 )
                return((char *)str1);
     
            while (*cp && size)
            {
                    s1 = cp;
                    s2 = (char *) str2;
                    n  = size;
     
                    while (n && !(*s1-*s2) )
                            n--, s1++, s2++;
     
                    if (!*s2)
                            return(cp);
     
                    cp++;
                    size--;
            }
     
            return(NULL);
    }
    C'est juste pour te donner des idées.....
    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

  5. #5
    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
    Merci beaucoup.

    En effet ce n'est pas bête. Je vais m'aider de ton code et du code microsoft afin de modifier strstr à ma sauce sans pour autant perdre en optimisation (car le temps d'exécution est autant voir plus important que la fonctionnalité du logiciel que je développe)

    Cela va permettre d'éviter un bug future sans pour autant résoudre mon problème majeur et bizarre.


    Edit: la fonction my_strstr est non fonctionnelle.

  6. #6
    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
    Petite précision: le message d'erreur à l'exécution est: "An unexpected error has prevented the operation from finishing (internal failure)"

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Je t'ai juste donné une piste et adapté dans le post en 2 secondes le code du strstr() originel afin de te donner un idée de comment faire.

    Maintenant à toi de faire ta fonction ou de modifier correctement strstr()
    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

  8. #8
    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
    Tout d'abord il y avait une erreur sur les operateur logique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      while (*cp && size)
            {
    Ici ce n'ai pas un && mais un ||. Ainsi on arretera la boucle que si l'on a atteint la fin du fichier

    d'ailleur on peut mettre directement



    Donc j'ai recodé la fonction strstr comme ceci:
    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
     
    char * the_strstr ( char * buf, char * sub, size_t size){
    	char * bp;
    	char * sp;
    	size_t n = 0;
     
    	if (!*sub)
    		return buf;
     
    	while (*buf || n<=size) {
    		bp = buf;
    		sp = sub;
    		do {
    			if (!*sp)
    				return buf;
    			n++;
    		} while (*bp++ == *sp++ && n<=size);
    		buf += 1;
    	}
    	return NULL;
    }

    Ceci marche quand je fait un programme test de cette manière:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    char *suiteChaine;
    char testChaine [1024] = "Tex\0te de test";
     
    suiteChaine = the_strstr(testChaine, "test", 16);
     
    cout  <<  endl << "size: " << size << endl;
     
    if (suiteChaine != NULL) 
    	cout  <<  endl << "Premiere occurence de test dans la variable testChaine de test : " << suiteChaine << endl;
    else
    	cout  <<  endl << "Premiere occurence de test dans la variable testChaine de test : NULL" << endl;


    Par contre quand je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *pos = new char [1024];
    pos = the_strstr(bufferFichier, "Scanning Acquire", 17 );
    if (pos == NULL)
    	cout  <<  endl << "variable pos: c'est NULL" << endl;
    else {
    	cout  <<  endl << "Ce n'est pas nul" << endl; 
     
    	cout  <<  endl << "Position du camera lenght: " << pos << endl;
    					}
    Il m'affiche NULL, alors que le buffer contient bien la chaine recherchée .


    Edit: Mon buffer de fichier contient avant tout type de caractère (c'est normale) comme "." ou "01" ou encore le caractère vide " " ou le caractère
    

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Le code suivant

    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
     
    #include "stdlib.h"
    #include "stdio.h"
     
    char * my_strstr (const char * str1, const char * str2, size_t size)
    {
            char *cp = (char *) str1;
            char *s1, *s2;
            size_t n;
     
            if ( !*str2 )
                return((char *)str1);
     
            while (size)
            {
                    s1 = cp;
                    s2 = (char *) str2;
                    n  = size;
     
                    while (n && !(*s1-*s2) )
                            n--, s1++, s2++;
     
                    if (!*s2)
                            return(cp);
     
                    cp++;
                    size--;
            }
     
            return(NULL);
    }
     
    int main(int argc, char* argv[])
    {
        char *s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        char *s2 = "ABCDEF\0GHIJKLMNO\0QRSTUVWXYZ";
        char *s3 = "WXY";
        char *s4 = "ZTOTO";
        char *s5;
     
        printf("s1 (full)    = %s\n", s1);
        printf("s2 (partial) = %s\n", s2);
     
        /* scan for s3 in s1 ----------------------------------------------- */
     
        s5 = my_strstr(s1, s3, 26);
     
        if (s5)
            printf("%s found in s1 at pos %d\n", s3, s5-s1);
        else
            printf("%s not found in s1\n", s3);
     
         /* scan for s3 in s2 ----------------------------------------------- */
     
        s5 = my_strstr(s2, s3, 26);
     
        if (s5)
            printf("%s found in s2 at pos %d\n", s3, s5-s2);
        else
            printf("%s not found in s2\n", s3);
     
        /* scan for s4 in s1 ----------------------------------------------- */
     
        s5 = my_strstr(s1, s4, 26);
     
        if (s5)
            printf("%s found in s1 at pos %d\n", s4, s5-s1);
        else
            printf("%s not found in s1\n", s4);
     
        /* scan for s4 in s2 ----------------------------------------------- */
     
        s5 = my_strstr(s2, s4, 26);
     
        if (s5)
            printf("%s found in s2 at pos %d\n", s4, s5-s2);
        else
            printf("%s not found in s2\n", s4);
     
     
        return EXIT_SUCCESS;
    }
    donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    s1 (full)    = ABCDEFGHIJKLMNOPQRSTUVWXYZ
    s2 (partial) = ABCDEF
    WXY found in s1 at pos 22
    WXY found in s2 at pos 23
    ZTOTO not found in s1
    ZTOTO not found in s2
    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

  10. #10
    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
    Merci pour ta réponse.

    A l'exécution tout se passe normalement (comme pour la fontion que j'ai implémenté).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    s1 (full)    = ABCDEFGHIJKLMNOPQRSTUVWXYZ
    s2 (partial) = ABCDEF
    WXY found in s1 at pos22
    WXY found in s2 at pos23
    ZTOTO not found in s1
    ZTOTO not found in s2

    En fait je me suis peut être mal exprimé sur le problème:
    Le problème intervient dans la lecture du buffer de fichier (je copie dans un buffer l'intégralité d'un fichier d'image).

    Quand je fait un printf du caractère:
    - quand il y a des caractères dans ce cas c'est des tags de l'image représenté en ascii
    - quand il y a une chaine vide dans ce cas ce sont des nombre à décoder en int, float, etc....

    Moi ce que je veux c'est juste récupérer les tags en ascii et donc se positionner au bon endroit dans le fichier.

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par funkyKong Voir le message
    Moi ce que je veux c'est juste récupérer les tags en ascii et donc se positionner au bon endroit dans le fichier.
    Et donc ?
    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

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    tout ça pour ça....

    while ( fgetc() )

    +

    isalpha
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  13. #13
    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
    souviron34 tout ça pour ça....

    while ( fgetc() )

    +
    eu non c'est bien plus compliqué que cela.

    D'abord, le seul moyen de savoir où se trouve un tag, c'est de regarder son label (qui es affiché sous forme d'un ascii).

    Par exemple si je veux récupérer la valeur du "Camera length" d'une image, elle se trouve juste aprés le label "camera lenght". Je dois donc chercher le label de chaque tag que je veux récupérer.

    Il y en a beaucoup de tags à récupérer et leur position dans le fichier varie totalement en fonction de l'image.

    De plus je ne peut pas lire le fichier octet par octet, cela prendrais beaucoup trop de temps. Je doit le lire en un seul coup et le stocker dans le buffer.

    Le problème que j'ai c'est que la recherche d'une chaine dans le buffer de fichier ne marche pas.



    Prenons comme exemple les 10 premier octets de l'image.

    Voici le code des 10 premier octets:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    4A 4B 00 02 00 00 00 00 04 4D   (en hexa)
    J   K   .   .     .   .  .    .   .   M   (en ascii)
    Remarque le caractère '.' est la valeur affiché dans l'editeur hexa. Quand on fait un printf sur par exemple l'octet 3 ca n'affiche rien.


    Si dans mon programme je cherche la chaine "JK" dans le buffer de fichier, la fonction my_strstr va la trouver. Mais si je cherche le caractère 'M', elle va retourner NULL à cause des octets 3 à 9.

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Si dans mon programme je cherche la chaine "JK" dans le buffer de fichier, la fonction my_strstr va la trouver. Mais si je cherche le caractère 'M', elle va retourner NULL à cause des octets 3 à 9.
    la fonction my_strstr() que je t'ai posté le gèrera...

    Dans l'exemple que je t'ai mis la chaine s2 présente un caractère NULL avant l'occurrence recherchée et elle est bien trouvée...
    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

  15. #15
    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
    Merci pour ta réponse.
    Mais non elle me renvoi toujours NULL quand je recherche "M" dans le buffer. ("JK" marche).

    J'avais déja testé cela avant (avec ta fonction et celle que j'ai implémentée), et je l'ai retesté. Et je t'assure à 100% que le buffer contient bien la chaine recherchée.

    C'est trop bizarre

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    postes donc ton code.

    Comment tu détermines la valeur de paramètre 'size' que tu passes à la fonction ?
    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

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par funkyKong Voir le message
    eu non c'est bien plus compliqué que cela.
    ....
    Si dans mon programme je cherche la chaine "JK" dans le buffer de fichier, la fonction my_strstr va la trouver. Mais si je cherche le caractère 'M', elle va retourner NULL à cause des octets 3 à 9.



    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
    #include <stdio.h>
     
    char Tags[] = { "CameraLength", "CameraWidth" };
    char Tempo[200] ;
    int NTags = 2 ;
    int NumTag =-1 ;
    int PosTag = 0 ;
    int Carac ;
    int  i;
     
     
    while ( (Carac = fgetc(fich)) != EOF )
      {
          if ( isalpha(Carac) )
            {
               Tempo[PosTag++] = Carac ;
            }
         else
           {
                if ( PosTag != 0 )
                   {
                       for ( i = 0 ; i < NTags ; i++ )
                          if ( strcmp(Tempo, Tags[i]) == 0 )
                             {
                                NumTag = i ;
                                break ;
                             }  
     
                       if ( NumTag >= 0 )
                           LitTag ( fich, NumTag );
     
                       PosTag = 0 ;
                       NumTag = -1 ;
                   }
           }
      }
    et que tu aies lu le fichier d'un bloc c'est pareil, suffit de remplacer les fgetc par l'accès au buffer direct..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    l'idée de Souviron34 est intéressante car elle réduit le nombre de parcours de chaine à faire) mais le code posté est à modifier pour le faire fonctionner...

    Notamment :
    • à chaque caractère alpha trouvé, PosTag est réinitialisé, donc Tempo ne contiendra toujours q'un seul caractère.. et donc rien ne sera trouvé.
    • strcmp(Tempo, Tags[i]) ne fonctionnera pas car le tag dans le flux ne terminera pas forcément par '\0'...
    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

  19. #19
    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 ce qui concerne mon code:

    NB1: Je fait une dll pour un logiciel.
    PlugIn::gResultOut c'est le seul moyen de faire une trace dans ce logiciel.

    NB2: désolé si il y a un brin de code c++ alors que l'on est dans un forum C (le problème est un problème du C et non du C++

    NB3: le code est loin d'être fini une fois que l'on a récupéré la position du tag souhaité (aprés il faudra recupérer la partie value du tag qui se trouve à 3 octets du tag name, mais cela ne pose en aucun cas un problème)

    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
    124
    125
    126
    127
    128
     
    char * my_strstr (const char * str1, const char * str2, size_t size) {
            char *cp = (char *) str1;
            char *s1, *s2;
            size_t n;
     
            if ( !*str2 )
                return((char *)str1);
     
            while (size)
            {
                    s1 = cp;
                    s2 = (char *) str2;
                    n  = size;
     
                    while (n && !(*s1-*s2) )
                            n--, s1++, s2++;
     
                    if (!*s2)
                            return(cp);
     
                    cp++;
                    size--;
            }
     
            return(NULL);
    }
     
     
     
     
     
     
     
    void TestEmiFile( DM_StringToken fich) {
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////      
    	//déclaration des variables
    	char* octet;
    	char * nomFichier;
    	bool run = true;
    	int numOctet = 0;
    	string  buff;
     
    	unsigned char valeurUchar;
    	ushort valeurUshort;
    	ulong valeurUlong;
    	double valeurDouble;
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////      
     
    	//nécéssaire pour manipuler les exceptions c++ correctement.
    	PLUG_IN_ENTRY
     
    	//on cast le type DM::String en type std::string.
    	string s = DM::String(fich).get_string();
     
    	//on vérifie que le nom du fichier n'est pas une chaine vide
    	if (s != "") {
     
    		//on verifie que le nom du fichier contient bien l'extension .emi
    		string::size_type loc = s.find( ".emi", 0 );
    		if( loc != string::npos ) {
     
    			//on calcul la taille du string s.
    			size_t size = s.size() + 1;
     
    			// on alloue dynamiquement la taille adéquate.
    			nomFichier = new char[ size ];	
     
    			// copier la chaîne.
    			strncpy( nomFichier, s.c_str(), size );
     
    			//fichier en flux d'entrée.
    			ifstream f_in  (nomFichier,ios::binary | ios::in);
     
    				//si f-in n'es pas déja ouvert alors on l'ouvre.
    				//si il est impossible de l'ouvrir correctement alors on ferme le fichier.
    				if (!f_in.is_open()) {
    					f_in.open(nomFichier,ios::out);
    					if (!f_in.is_open())  {
    							DM :: ShowAlert("Le fichier fich n'a pas pu être chargé",0);
    							run = false;
    					}
    				}
     
    				//si le fichier a été ouvert avec succés alors on récupère les informations utile de l'image au format .ser
    				if (run) {
     
    					// taille du fichier
    					f_in.seekg(0,ios_base::end);
    					int size= f_in.tellg();
    					f_in.seekg(0,ios_base::beg);
     
    					// on lit le fichier entierement  et on le copie dans le buffer
    					char * bufferFichier = new char[size];
    					f_in.read(bufferFichier,size);
     
     
                                           /*trace pour vérifier que le fichier contient bein la chaine ascii "Camera" */
    					PlugIn::gResultOut  <<  endl << "Buffer fichier: " << bufferFichier[8390648] << bufferFichier[8390649] << bufferFichier[8390650] << bufferFichier[8390651] << bufferFichier[8390652] << bufferFichier[8390653]  << endl;
     
     
    					/*trace pour le debug les octets 3 à 9 affiché sont vides.....*/  
    					for (int i=0;i<60;i++)
    						PlugIn::gResultOut  <<  endl << "buf[" << i << "] = " << bufferFichier[i] << endl;
     
     
    					int ind = str_istr (bufferFichier, "Camera",7 );
    					PlugIn::gResultOut  <<  endl << "Enfin voilà l'indice avec my_strstr => " << ind << endl;
    			                /*Ca me retourne -1*/
     
     
    					// on libére la mémoire
    					delete [] nomFichier;
    					delete[] bufferFichier;
     
    					// Fermeture des fichiers
    					f_in.close();
    				} 
     
    		} else
    				DM :: ShowAlert("Ce n'est pas un fichier .emi ",0);
    	} else 
    		DM :: ShowAlert("Le non du fichier passé en paramètre est vide !",0);
     
    	//nécéssaire pour manipuler les exceptions c++ correctement.
    	PLUG_IN_EXIT
    }
    ///////////////////////////////////////////////////////////////////////////////

    Merci d'avance

  20. #20
    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
    oui c'est une bonne idée. Je vais regarder en détail le code de Souviron34 mais je ne suis pas sûr que cela va fonctionner (actuellement la recherche dans le buffer ne fonctionne pas)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

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, 17h59
  2. Rechercher une sous chaine dans un chaine
    Par franck06 dans le forum Access
    Réponses: 2
    Dernier message: 20/09/2006, 14h53
  3. Recherche une sous-chaine dans un champ ?
    Par nerick dans le forum Requêtes
    Réponses: 3
    Dernier message: 06/03/2006, 13h46
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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