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 :

Extraire une chaine de caractère d'un fichier


Sujet :

C

  1. #1
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut Extraire une chaine de caractère d'un fichier
    Bonsoir, j'ai un fichier contenant du xml : http://weather.aero/dataserver_curre...ursBeforeNow=1

    J'aimerai extraire de ce fichier la ligne qui est entre <raw_text> et </raw_text>, et la stocker ailleurs.

    Sans utiliser de librairies comme libxml...et je ne sais pas comment faire, pour l'instant j'ouvre mon fichier et je le lis c'est tout

    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>
    #include <stdlib.h>
    #include <string.h>
    #define TAILLE_MAX 255
    #define NB_LIGNE 100
     
    int main (int argc, char *argv[])
    {
    //Déclaration des variables
        int i=0, taille=0;
        char ligne[NB_LIGNE];
        char meteo[NB_LIGNE][TAILLE_MAX];
        FILE *fichier=fopen("meteo.txt", "r");
     
    //Test ouverture fichier
        if (fichier == NULL)
        {
            printf("Fichier introuvable.");
            return 0;
        }
     
    //Lecture du fichier
        while (fgets(ligne, TAILLE_MAX, fichier) != NULL)
        {
            strcpy(meteo[taille], ligne);
            taille++;
        }
     
    //Affichage du contenu
        for (i=0; i<=taille; i++)
            printf("%s", meteo[i]);
     
     
        fclose(fichier);
        return 0;
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Si tu as l'assurance que <raw_text> et </raw_text> se trouvent toujours sur la même ligne, il n'y a pas lieu de charger tout le fichier dans un tableau.

    Il suffit de lire, ligne par ligne, le fichier, jusqu'à ce que les deux sous-chaines apparaissent. Il suffit ensuite de copier le contenu, dans un buffer, en se plaçant correctement et en calculant le nombre de caractères à copier.

    Tu peux adapter ce code à tes besoins :
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    #define TAILLE_MAXI_LIGNE 256
    #define TAILLE_MAXI_METAR 128
     
    int main (void)
    {
    	FILE * fichier;
    	char raw_text[TAILLE_MAXI_METAR];
     
    	fichier = fopen("meteo.txt" , "r");
    	if (fichier != NULL)
    	{
    		char ligne[TAILLE_MAXI_LIGNE];
    		int ok = 0;
    		while (fgets(ligne , TAILLE_MAXI_LIGNE , fichier) != NULL)
    		{
    			char * recherche_sous_chaine_1;
    			char * recherche_sous_chaine_2;
     
    			recherche_sous_chaine_1 = strstr(ligne , "<raw_text>");
    			if (recherche_sous_chaine_1 != NULL)
    			{
    				recherche_sous_chaine_1 += 10; /* on se positionne juste après "<raw_text>" */
    				recherche_sous_chaine_2 = strstr(ligne , "</raw_text>");
    				if (recherche_sous_chaine_2 != NULL)
    				{
    					int taille_metar = recherche_sous_chaine_2 - recherche_sous_chaine_1;
    					if ( taille_metar >= TAILLE_MAXI_METAR )
    						printf("metar trop long\n");
    					else
    					{
    						strncpy(raw_text , recherche_sous_chaine_1 , taille_metar);
    						raw_text[taille_metar] = '\0';
    						printf("%s\n" , raw_text);
    					}
    					ok = 1;
    					break;
    				}
    			}
    		}
    		fclose(fichier);
    		if ( !ok )
    			printf("sous-chaine(s) non trouvee(s)\n");
    	} else
    		printf("Fichier non trouve\n");
     
    	return EXIT_SUCCESS;
    }
    Ce code ne présente aucune difficulté, mais si tu as des questions...

  3. #3
    Membre habitué Avatar de mailbox
    Profil pro
    Inscrit en
    Février 2010
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2010
    Messages : 140
    Points : 159
    Points
    159
    Par défaut
    Je viens de tester, et ça a l'air de faire exactement ce que je veux Je reposterai ici si j'ai des questions

    Merci (une fois de plus^^) jeroman!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/12/2011, 14h22
  2. Réponses: 3
    Dernier message: 25/08/2011, 10h26
  3. Réponses: 4
    Dernier message: 18/07/2006, 16h31
  4. [VB]Recherche d'une chaine de caractère dans un fichier
    Par Empty_body dans le forum VB 6 et antérieur
    Réponses: 26
    Dernier message: 16/02/2006, 09h10
  5. Ecriture d'une chaine de caractères dans un fichier
    Par fleur_de_rose dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 09h34

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