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 :

contenu de fichier


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    root
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut contenu de fichier
    Bonjour,
    Dans un fichier, je veux extraire le contenu dont le début doit commencer par chaine A et la fin se terminer par chaine B.

    Par exemple dans un fichier html:
    A=<div class="texte">
    B=</div>

    Je dois prendre tout ce qu'il a entre A et B, toute sorte de caractère.

    Pour la programmation ce que j'ai penser à faire:
    - lire le fichier caractère par caractère
    - comparer chaque caractère jusqu'à ce que c'est égale à A[0]
    - si c'est égale je continue et compare le caractère qui le suit
    - si une fois tout est égale, je compares B[0] tout les caractères qui suit le dernier A[i] mais en plus de comparé je sauvegarde le caractère ailleurs
    - une fois tout les B[i] sont égale, j'arrête de sauvegarder le contenu et comme la chaine B étant aussi sauvegarder, j'efface les derniers X nombre de caractère de B qui n'ont pas besoin d'être dans la sauvegarde


    Pour faire autrement et plus simplement,
    - je trouves A de la même manière, je prend note la position du caractère suivant,
    - pareil pour B mais c'est la position du caractère précédant que je prend note
    - au final je sauvegarde tout entre ces positions


    Est-ce une bonne méthode ou il y a mieux que je puisse faire ?

    J'aimerais le faire et ajouter dans ma bibliothèque qui pourra servir de gestion sur donnée plus tard.
    Je pourrais l'élaborer
    - ajouter exception à X nombre de fois, s'il y a des doublons de A ou B
    - n'avoir que A ou que B et prendre le contenu avant ou après

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Sinon, il existe ce qu'il faut dans la bibliothèque standard.

    Alternativement, tu peux utiliser le shell pour faire cela : cat filename | tr '\n' '\r' | sed "s/first_string\(.*\)last_string/\1/g" (filename, first_string et last_string sont à remplacer par les valeurs qui vont bien, s'entend).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    root
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonne fonction strstr.
    Dommage qu'il n'y a pas la possibilité de choisir un point de départ, car:
    Avec une variable contenant tout un fichier html, on risque grandement de trouver la position d'un div fermant avant même d'avoir trouver le div ouvrant (unique) voulu.

    Donc pour la position c'est bon mais pour l'ordre c'est pas idéal.

    Il me reste alors
    - mettre le contenu du fichier html dans une variable
    - chercher la position du div ouvrant (qui n'a pas de doublons) avec strstr sur la variable
    - supprimer tous les caractères qui sont avant la position trouver de la variable
    - chercher la position du premier div fermant avec strstr sur la variable à jours

    En gros ça reste la même méthode, ça m'évite au moins de rechercher caractère par caractère la bonne chaîne.

    Merci.

  4. #4
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    Quelque chose dans style-là ?
    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
    #define START_STR	"<div class=texte>"
    #define STOP_STR	"</div>"
     
    char html_code[....];				// on suppose que le code html a été lu dans cette variable
    char *s,*t;
     
    s=strstr(html_code,START_STR);
    while(s!=NULL) {
    	s+=strlen(START_STR);
    	t=strstr(s,STOP_STR);
    	if(t!=NULL) {
    		int len=(t-strlen(STOP_STR))-s+1;
    		// sauver s sur une longueur len dans une variable ( /!\ au \0 )
    		s=strstr(t+strlen(t),START_STR);
    	}
    	else {
    		// voir que faire, peut-être
    		break;
    	}
    }
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  5. #5
    Futur Membre du Club
    Homme Profil pro
    root
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Je sais pas si ton code fonctionne mais ça me défonctionne

    Je suis plus à l'aise à comprendre ce que j'écris.
    Voici la miène (modifier):
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main()
    {
        char *ouverture = "<div class=\"texte\">";
        char *fermeture = "</div>";
     
        char code_html[500] = "<div class=\"menu\">ca marche pas</div>\n<div class=\"texte\">ca marche bien</div>\n<div class=\"autre\">ca marche pas</div>";
     
        printf("étape 1:\n%s\n\n", code_html);
     
        int position_contenu_debut = (strstr(code_html, ouverture) - code_html) + strlen(ouverture);
        int j = 0;
        for(int i = position_contenu_debut; i <= strlen(code_html); i++){
            code_html[j]=code_html[i];
            j++;
        }
        printf("étape 2:\n%s\n\n", code_html);
     
        int position_contenu_fin = (strstr(code_html, fermeture) - code_html);
        for(int i = position_contenu_fin; i < strlen(code_html); i++){
            code_html[i]='\0';
        }
        printf("étape 3:\n%s", code_html);
     
        return 0;
    }

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par m4d3x Voir le message
    Dommage qu'il n'y a pas la possibilité de choisir un point de départ, car:
    Avec une variable contenant tout un fichier html, on risque grandement de trouver la position d'un div fermant avant même d'avoir trouver le div ouvrant (unique) voulu.
    Je n'ai pas saisi. On ne cherche pas le marqueur de fin avant d'avoir cherché (et trouvé) le marqueur de début. Tu as simplement besoin d'un automate à deux états : soit on est en train de chercher le premier marqueur, soit le second. Et on alterne.

    Souviens-toi que pour une chaîne de caractères s donnée, tous les pointeurs de &s[0] à &s[strlen(s)] sont aussi des chaînes à part entière.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    root
    Inscrit en
    Juin 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : root

    Informations forums :
    Inscription : Juin 2016
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Quand je disais: dommage qu'il n'y a pas la possibilité de choisir un point de départ.
    Je parlais de simplification à ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int position_contenu_fin = (strstr(code_html, fermeture) - code_html);
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int position_point_de_départ=1234;
    int position_contenu_fin = (strstr(code_html, fermeture, position_point_de_départ) - code_html);
    Ancien code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char code_html[500] = "</div><div class=\"texte\">ca marche bien</div><div class=\"autre\">ca marche pas</div>";
        int position_de_debut = (strstr(code_html, ouverture) - code_html);
        int position_de_fin = (strstr(code_html, fermeture) - code_html);
    position_de_debut aurait eu la position 6
    position_de_fin aurait eu la position 0
    la position_de_fin désirer est celui de la position 39, car c'est le div fermant du div class texte qui contient le contenu désirer, donc faudra coder plus pour atteindre l'objectif

    Nouveu code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char code_html[500] = "</div><div class=\"texte\">ca marche bien</div><div class=\"autre\">ca marche pas</div>";
        int position_de_debut = (strstr(code_html, ouverture, 0) - code_html);
        int position_de_fin = (strstr(code_html, fermeture, position_de_debut) - code_html);
    position_de_debut aurait eu la position 6
    position_de_fin aurait eu la position 39

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/10/2009, 13h32
  2. Contenu du fichier log d'une BD
    Par sandanr dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 26/10/2005, 14h50
  3. Lire le contenu dans fichier raccourci .lnk
    Par THALES dans le forum C++Builder
    Réponses: 2
    Dernier message: 11/10/2005, 12h37
  4. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49
  5. Récupérer contenu de fichier dans une variable
    Par peppena dans le forum Linux
    Réponses: 4
    Dernier message: 15/06/2005, 12h50

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