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 :

Sélection des données dans un fichier txt pour remplir une structure


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut Sélection des données dans un fichier txt pour remplir une structure
    Bonjour a tous.

    J'ai ce programme :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    struct application
    {
        char id[100];
        char descr [100];
        char owner [100];
    };
     
    int main()
     
    {
    int i=0;
    struct application tab[1];
    FILE*batch;
    batch=fopen("C:\\Documents and Settings\\xxx\\Bureau\\recup_simple.txt","r");
        //for(i=0;i<3;i++)
    //{
        fscanf(batch,"%s %s %s",&tab[i].id,&tab[i].descr,&tab[i].owner);
        printf("%s\n%s\n%s\n",tab[i].id,tab[i].descr,tab[i].owner);
    //}
    }
    me permettant de remplir ma structure avec des lignes d'un fichier txt en pièce jointe. Voici le contenu de ce fichier :
    ID(appli01) 
    DESCR('programme1')
    OWNER('tabs02')
    Mon souhait est de remplir ma structure pas avec toute la ligne mais avec les mots entre parenthèses (ou ' ' et parenthèses).Sachant que le nombre de caractères peut varié, comment sélectionner sans avoir recours aux pointeurs (si cela est possible)

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre averti
    Avatar de ChipsAlaMenthe
    Homme Profil pro
    Ingénieur en eau chaude et ballon rond
    Inscrit en
    Mai 2015
    Messages
    138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur en eau chaude et ballon rond
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2015
    Messages : 138
    Points : 394
    Points
    394
    Par défaut
    Salut à toi! ^^

    Regarde du côté des "sscanf", "sprintf", fprintf", tu trouveras ton bonheur ^^.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    @ChipsAlaMenthe : as-tu lu son code ? Il utilise fscanf()...

    @nysay27 : l'idée est là, mais il faut jouer un peu plus finement avec les formateurs.

    Quelque chose comme ça pourrait faire l'affaire.
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        char buffer[1000] = {0};
        const char * str = "ID(appli01)";
        sscanf(str, "%*[^(](%99[^)])", buffer);
        printf("--> %s\n", buffer);
     
        str = "DESCR('programme1')";
        sscanf(str, "%*[^(](%99[^)])", buffer);
        printf("--> %s\n", buffer);
     
        str = "OWNER('tabs02')";
        sscanf(str, "%*[^(](%99[^)])", buffer);
        printf("--> %s\n", buffer);
    }

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Merci beaucoup pour la réponse.

    J'ai deux petites questions .Mais si c'est question sont résolues, j'aurais fait un grand pas en avant.

    Petit 1 ) Est ce que je peux meler la fonction fgets pour lire tout mon txt et sscanf qui après un test de chaine de caractère me permettrait de de remplir toute une série de structure?

    Petit 2) Je vois que la sélection est très compliquée sur un txt, si imaginons j'ai des séries de blanc sur le coté, je devrais clairement les spécifiés dans le sscanf?
    Cela est très difficile du coup pour la reproductivité du programme (si le txt est un peu décalé a l'enregistrement...)?

    Merci

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    L'idée est plutôt de faire un fscanf() sur le fichier, pour récupérer les données sans avoir besoin de les charger en RAM. J'ai utilisé sscanf() car c'est un peu plus simple pour écrire un test.

    Pour ce qui est des blancs, j'ai testé le code suivant et il les supprime bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        str = "  DESCR  ('programme1')";
        sscanf(str, "%*[^(](%99[^)])", buffer);
        printf("--> %s\n", buffer);
    Le formateur %*[^(] dit de jeter tous les caractères jusqu'à rencontrer une parenthèse, donc les blancs sont eux aussi jetés. Si c'était bien ça ta question...

    Remarque que tu peux aussi faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        str = "DESCR('programme1')";
        sscanf(str, "DESCR(%99[^)])", buffer);
        printf("--> %s\n", buffer);

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Mervi Btero 1000 fois. Je test tout cela demain quand j'ai environnement de développement et je te tiens au courant

  7. #7
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    Merci pour tes réponse cependant j'ai une question :

    Avec cette méthode en mettant tes exemples dans un fichier txt et avec le programme 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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
     
    FILE*batch;
    batch=fopen("D:\\Users\\U00I346\\Desktop\\test.txt","r");
     
        if(batch==NULL)
    	{
    		fputs("erreur à l'ouverture du fichier\n",stderr);
    		return EXIT_FAILURE;
    	}
     
        char buffer[1000] = {0};
            sscanf(batch, "DESCR(%99[^)])", buffer);
            printf("--> %s\n", buffer);
     
    }
    Le buffer ne me retourne rien, est ce que c'est a cause de la variable batch qui n'est pas reconnus ou est ce

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Il faut que tu utilises fscanf (f pour file) et non sscanf() (s pour string).

  9. #9
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2015
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 105
    Points : 71
    Points
    71
    Par défaut
    D'accord, j'ai fait pas mal de test et je voyais que cela me menais nulle part.

    En fait mon ambition était la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    n=cpteLignes;//retour fonction nombre de ligne
                        for(i=0;i<n;i++)
                        {
                            fscanf(batch,"%s",&ligne_lue);
                               if(strcmp(ligne_lue,tableau1)==0)
                                {
                                    sscanf(batch,"%*[^(](%99[^)])", &tab[i].id);
                                    break;
                                }
    En lisant le txt et par une fonction fscanf qui marche bien pour cette lecture, je voulais utiliser ta technique de sélection pour que :

    Quand je détermine par la fonction strcmp le début d'un paragraphe qui m'interresse, je puisse sélectionner des informations en fonction de leurs titre.

    Exemple :
    Je cherche le mot Dudule
    je localise le mot Dudule par la fonction "strcmp"
    Je me déplace par tabulation horizontale et par les lignes de code que tu m'a donnée pour sélectionner programme 1 dans " DESCR ('programme1')" par exemple;

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

Discussions similaires

  1. Rechercher des données dans un fichier txt
    Par joboy84 dans le forum Langage
    Réponses: 5
    Dernier message: 11/06/2008, 15h00
  2. Réponses: 6
    Dernier message: 20/01/2008, 16h32
  3. [VBS]Lire des données dans un fichier .txt
    Par kacxial dans le forum VBScript
    Réponses: 4
    Dernier message: 28/02/2007, 13h44
  4. Réponses: 1
    Dernier message: 05/09/2006, 17h56
  5. Remplacer / Supprimer des données dans un fichier txt
    Par PedroBD dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 13h33

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