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 :

rechercher une chaine de caractere dans un fichier


Sujet :

C

  1. #1
    jad
    jad est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut rechercher une chaine de caractere dans un fichier
    bonjour,

    Je dois modifier un programme en c.

    J'ai un fichier xml en entrée :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Application="GULLI"
    Version="1.0.24"
    TimeStamp="20080319114957"
    TotalServices="1"
    TotalCustomers="4"-->
    <MA profile="VENTE_VIDEO" version="6.01.01"

    Je dois m'arréter sur la ligne qui contient "MA profile="
    et je veux récuperer la chaine VENTE_VIDEO
    (la longueur n'est pas fixe.) qui se trouve
    entre les 2 guillemets
    ---------------------------------------------------
    je cherche une solution!!

  2. #2
    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
    propose, et on t'aidera..

    Pour info : fgets, strncmp, sscanf...
    "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

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Salut,

    Si tu veux une solution "solide" qui te permettra de faire entre autre ce que tu veux, et bien plus si ton projet doit se développer : utiliser la libxml . Sinon, tu peux essayer de te débrouiller avec des fscanf : quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char contenu[1024];
    while(fscanf(fichierXML,"<MA profile=\"%s\"",contenu) != 1);
    devrait te réccupérer ce que tu veux et le mettre dans contenu (c'est juste l'idée, je n'ai pas testé, mais tu peux faire un man fscanf si tu es sous linux, ou google man fscanf).

    Hésite pas à me le dire si c'est pas clair, ou si tu veux plus de détails.

    @+
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  4. #4
    jad
    jad est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut question supprlementaire
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Application="GULLI"
    Version="1.0.24"
    TimeStamp="20080319114957"
    TotalServices="1"
    TotalCustomers="4"-->
    <MA profile="VENTE_VIDEO" version="6.01.01"
    ...

    1-Une fois que je trouve la chaine "ma profile="",
    2-je parcours la ligne caractere par caractere aprés le guillemet et je les stocke jusqu'a rencontrer le guillmet " .

    comment recuperer la chaine entre guillmet sachant la chaine n'est pas de longueur fixe?

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define test "test.xml"
    main()
    {
    	FILE *flot;
    	char v,*chaine,*res;
    	int c,j,s;
    	long i ;
    	flot=fopen(test,"r+");
    	i=ftell(flot);
    	chaine=malloc(sizeof(char));
    	res=malloc(sizeof(char));
    	chaine="MA profile=""
    	s=strlen(chaine);
    	while((c=fgetc(flot))!=EOF)
    	{
    		fseek(flot,-1,SEEK_CUR);
    		for(j=0;j<s;j++)
    		{	
    			fscanf(flot,"%c",&v);
    			if(chaine[j]!=v)
    			{
    parcourir la ligne apres l'ocurence trouvée(Ma profile=";
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    			}else
    				res[j]=v;
    		}
    	}
    	for(j=0;j<s;j++)				
    	printf("%c",res[j]);
    	fclose(flot);
    	return(0);
    }
    merci pour votre aide

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Voilà un bout de code qui fonctionne presque tout le temps :
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define TEST "test.xml"
     
    int main(void)
    {
      FILE *flot;
      char chaine[1024] = {'\0'}; 
      char ligne[1024] = {'\0'};
      int trouve = 0;
     
      flot=fopen(TEST,"r+");
      if(!flot)
        {
          fprintf(stderr,"Impossible d'ouvir le fichier\n");
          return 1;
        }
     
      while(trouve == 0 && fgets(ligne,1023,flot) != NULL)
        {
          printf("ligne : %s",ligne);
          if(sscanf(ligne,"<MA profile=\" %s \" ",chaine) == 1)
        trouve = 1;
        }
     
      fclose(flot);
     
      if(trouve == 1)
        printf("\nContenu trouvé : le contenu : %s \n",chaine);
      else
        printf("\nPas de contenu trouvé.\n");
     
      return 0;
    }
    Je dis presque tout le temps car il ne reccupère pas tout le contenu de l'attribut profile quand il y'a des espaces à l'intérieur du contenu (ie quand on a profile="VENTE VIDEO" on ne récupère que VENTE), et en plus quand on récupère tout il ajoute un " à la fin.
    Je n'ai pas eu le temps de résoudre ces petits bug, mais l'idée y est, je te laisse compléter, et je suis là (demain, pas ce soir) si ça marche pas.

    Bon courage !
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  6. #6
    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 jad Voir le message
    comment recuperer la chaine entre guillmet sachant la chaine n'est pas de longueur fixe?
    Facile avec un peu de lecture ....

    Ligne = ligne du fichier lue (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
    26
    char Ligne[500];
    char ChaineAStocker[500] ;
    char *p, *pdebut, *pfin ;
    FILE *Fichier ;
     
    ....
     
    while ( fgets(Ligne, 500, Fichier) != NULL )
    {
        if ( (p = strstr(Ligne, "<MA profile")) != NULL ) /* C'est la bonne ligne */
          {
              pdebut = strchr (  (p+1), '"' ); /* On cherche debut de la chaine */
              if ( pdebut != NULL )
                {
                    pfin = strchr ( (pdebut+1), '"' ); /* On cherche fin de la chaine */
                    if ( pfin != NULL )
                      {
                          *pfin = '\0' ; /* Temporairement on met une fin de chaine */
     
                           strcpy ( ChaineAStocker, (pdebut+1) ); /* On stocke */
     
                           *pfin = '"' ; /* On remet la chaine telle qu'elle etait */
                      }
                }
          }
    }
    "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

  7. #7
    jad
    jad est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut j'ai un guillement en trop au debut de la chaine extraite
    ok ça marche bien .
    le resultat est :
    "Le contenu est :"Deactive_VIDEO"

    maintenant je dois enlever le guillemet avant la chaine "Deactive"
    pour avoir : "Le contenu est :Deactive_VIDEO"

    le code que j'utilise est :
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define TEST "test.xml"
     
    char Ligne[500];
    char ChaineAStocker[500] ;
    char *p, *pdebut, *pfin ;
    FILE *Fichier ;
     
    int main(void)
    {
      FILE *flot;
      char chaine[1024] = {'\0'};
      char ligne[1024] = {'\0'};
      int trouve = 0;
     
      flot=fopen(TEST,"r+");
      if(!flot)
        {
          fprintf(stderr,"Impossible d'ouvir le fichier\n");
          return 1;
        }
    while ( fgets(Ligne, 500, flot) != NULL )
    {
        if ( (p = strstr(Ligne, "<MA profile=")) != NULL ) /* C'est la bonne ligne */
          {
              pdebut = strchr (  (p+1), '"' ); /* On cherche debut de la chaine */
              if ( pdebut != NULL )
                {
                    pfin = strchr ( (pdebut+1), '"' ); /* On cherche fin de la chaine */
                    if ( pfin != NULL )
                      {
                          *pfin = '\0' ; /* Temporairement on met une fin de chaine */
     
                           strcpy ( ChaineAStocker, pdebut ); /* On stocke */
                           /*strcpy ( ChaineAStocker, pdebut );  On stocke */
     
                           *pfin = '"' ; /* On remet la chaine telle qu'elle etait */
                      }
                }
          }
    }
    fclose(flot);
    printf("Le contenu est :%s\n",ChaineAStocker);
    }

  8. #8
    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
    ooops c'est ma faute...

    C'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy ( ChaineAStocker, (pdebut+1) ); /* On stocke */
    puisque pdebut est le guillemet...

    j'ai fait ça vite..
    "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

  9. #9
    jad
    jad est déconnecté
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 13
    Points : 12
    Points
    12
    Par défaut solution ok
    ça marche impeccable

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

Discussions similaires

  1. rechercher une chaine de caractère dans un fichier
    Par 3FHFEB dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2006, 11h13
  2. Réponses: 9
    Dernier message: 07/09/2006, 13h47
  3. Réponses: 10
    Dernier message: 16/06/2006, 13h53
  4. Réponses: 10
    Dernier message: 22/05/2006, 11h45

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