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 :

Comment remplir un tableau de structures à partir d'un fichier texte en C ?


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Comment remplir un tableau de structures à partir d'un fichier texte en C ?
    salut a tous et a toutes

    en faite j'ai tout un programme a faire et je suis encore débutant techniquement au niveau C
    il faut que je créer un tableau des structures qui lit deux champs a partir un fichier text,
    voila la structure du fichier text :
     Temps         ID             Capteur
    10:00:00	10001		E01
    10:00:30	10001		C01
    11:30:05	10001		S01
    11:35:45	10001		L01
    11:40:23	10002		E01
    11:45:56	10001		C02
    11:46:36	10001		V01
    11:47:06	10001		I01
    11:48:23	10002		S01
    11:49:11	10002		L01
    11:50:22	10001		D01
    11:50:56	10002		C02
    11:52:36	10002		V01
    11:53:06	10002		I01
    11:54:22	10002		D01
    11:55:34	10001		B01
    12:00:51	10001		M01
    12:01:51	10002		B01
    je vais créer un tableau qui lit l'ID et le capteur et qui va les enregistrer dedans

    ID = 10001                              | 10002
    Parcourt =E01C01S01 .............  | E01L01C02 ..........
    et puis comparer le parcourt (liste des capteurs) enchainé par chaque ID avec le parcourt que chaque personnel doit faire
    le parcourt dont on va comparé est une chaine de caractère :
    E01C01S01L02C02V01I01D01B01M01

    si le parcourt fait par le personnel est compatible avec le parcourt qui doit faire donc si les 2 chaines sont les mêmes c'est super
    sinon on doit créer un autre tableau pour mettre dedans l'ID et l'alarme qu'elle doit être affiché comme un message genre il n'a pas activé le capteur C01
    tout dépend ce qu'il manque ou ce qu'il y'a de plus dans le parcourt.

    Merci pour votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Ah...

    Aujourd'hui, j'ai été faire les courses.
    C'était chouette, car il y avait du jambon, et moi j'aime le jambon.
    En plus, si j'ai du jambon et du fromage, je peux me faire un croque-monsieur.
    Et c'est bon, un croque-monsieur !

    Quel est le rapport ?
    Un peux la même chose que ce que tu nous dis, là.

    Hormis nous exposé un projet/devoir de cours, qu'as-tu fais ?
    Quel est ta question ? Ton problème ?

    As-tu un exemple de code, une demande précise sur un point que tu ne comprends pas ?
    As-tu seulement commencé ?

    Nous ne sommes pas ici pour faire tes exercices. Par contre, si tu as un problème sur un point précis, nous pouvons éventuellement t'aider.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    mon ami, je vous est fait seulement une explication de mon projet sinon ma question est :

    comment remplir un tableau des structures a partir un fichier texte en prenant seulement les champs que je veux utiliser ?

  4. #4
    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 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Il est possible que fscanf() fasse l'affaire. Voici par un exemple un code pour lire une matrice de flottants (écrit à partir d'une discussion Dvpez donnée en commentaire dans le code : https://github.com/Bktero/DummyCodes...chierDeFloat.c). Il faudra que tu regardes comme on peut sauter des champs, et mettre ceux que tu veux dans ta structure. Ce tutoriel te sera sans doute utile : http://xrenault.developpez.com/tutoriels/c/scanf/

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Comme c'est toujours la même structure de donnée qui se répète dans le fichier, pourquoi ne pas tout simplement créer une structure à trois champs ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct t_maStructure{
        char time[8]; // taille champ Temps
        unsigned int id; 
        char typeCapt[3]; // Sous-réserve que le matricule d'un id fasse toujours 3caractères
    };
    A partir de cela, tu peux parcourir séquentiellement ton fichier à l'aide d'un fread() par exemple et récupérer la ligne complète d'informations du fichier dans ta structure. (attention aussi de prendre en compte d'éventuel \t et \n )
    Après, il suffit de lire la structure pour récupérer les informations dont tu as besoin.

  6. #6
    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 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    fread() est fait pour lire du binaire, écrit avec le fonction fwrite(). fscanf() est fait pour lire du texte, écrit avec la fonction fprintf(). Or, le fichier montre semble être au format texte et le PO ne veut pas converser le timestamp. Je pense que fscanf() est plus adapté dans ce cas.

    PS : je viens d'écrire un code qui fait le taff, mais je préfère faire réfléchir un peu avant de donner la solution

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    parce que je vais pas utiliser le temps je vais remplir le tableau de structure seulement par l'ID et par le capteur en enregistrant tous les capteurs parcouru pour chaque ID

  8. #8
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       char id[50];
       char capteur[50];
       fscanf(fichier, "%*s%s%s" ,id, capteur);
    L'étoile dans le premier %s permet d'ignorer (c'est à dire de le lire sans le stocker) le premier champ de la ligne, le temps
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  9. #9
    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 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Un code un peu plus complet :
    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
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
        int id;
        char name[4];
    } sensor_t;
     
    int main(void)
    {
        FILE* f = fopen("data.txt", "r");
        assert(f != NULL);
     
        int count = 0;
        do
        {
            sensor_t s = {0, "inv"};
            count = fscanf(f, "%*d:%*d:%*d\t%d\t%s\n", &(s.id), s.name);
            printf("Sensor = %d %s\n", s.id, s.name);
     
        } while(count == 2);
     
        printf("Count = %d\n", count);
     
        if(feof(f))
        {
            puts("End of file has been reached");
        }
        else
        {
            puts("A badly formatting line or a file error has been encountered");
        }
     
        fclose(f);
    }
    Il y a plusieurs formatages possibles pour fscanf(), selon les humeurs.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci infiniment vous m'avez aidé mais la j'ai des erreurs que j'arriver pas a corriger !!


    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct 
    {
        int id;
        char parcourt[1000];
    } Personne;
     
    int main(void)
    {
     
            Personne tab_personne[100]; 
            int longeur = 0 ;
            FILE* fichier = NULL;
            int test=1; 
            fichier = fopen( "/home/kass/mohamed_c/file_cap", "r") ;
     
            if (fichier != NULL)
            {
     
                         int nouveau_id , i  ; 
                         char nouveau_capteur[100] ; 
                 while ( feof(fichier)==0 )
                 {
                            fscanf(fichier, "%*d:%*d:%*d\t%d\t%s\n", &nouveau_id,nouveau_capteur) ; 
     
                            i=0;
                                while ( i<longeur && test==1 ) 
                                {
                                    if( tab_personne[i].id==nouveau_id)
                                    {
                                       strcat(tab_personne[i].parcourt , nouveau_capteur ) ;  
                                       test = 0 ;
                                    }
     
                                    i++;
     
                                if(test==1)
                                {
                                    Personne p ;       
                                    p.id=nouveau_id;
                                    strcpy(p.parcourt,nouveau_capteur);
                                    tab_personne[longeur]=p;
                                    longeur++;
                                }
                            test=1;
     
                 }      
            }  
     
     
     
                FILE* fichier2 = NULL;
                fichier2 = fopen( "/home/kass/mohamed_c/fmain", "r") ;
                char parcourt_correct[100]; 
                    if (fichier2 != NULL)
                    {
     
                         while ( feof(fichier2)==0 )
                         {
                              fscanf(fichier2, "%s", parcourt_correct) ; 
                         }                          
                    }       
     
                for ( i =0 ; i<longeur ; i++ )
                {
                    //if(tab_personne[i].parcourt==parcourt_correct)
                    if(strcmp(tab_personne[i].parcourt,parcourt_correct)==0)
                    {
                        printf("id = %d est correct \n", tab_personne[i].id);
                    }
                    else
                    {
                        printf("id = %d n est pas correct \n" , tab_personne[i].id);
                    }
                }                                                                      
     
     
    }

    Nom : Capture d’écran 2014-12-01 à 20.23.22.png
Affichages : 4044
Taille : 563,1 Ko

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    C'est bon il manque un }

    merci encore une autre fois

  12. #12
    Invité
    Invité(e)
    Par défaut
    ( n'oublie pas aussi de rajouter le return 0; sur ton main() de type int )

    Fait attention à ta manière de traiter le fscanf() aussi.. Tu vas lire une ligne en trop. (voir ici: http://www.developpez.net/forums/d14...cture-fichier/ )
    Dernière modification par Invité ; 01/12/2014 à 21h06.

  13. #13
    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 677
    Points
    13 677
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par archMqx. Voir le message
    ( n'oublie pas aussi de rajouter le return 0; sur ton main() de type int )
    C'est mieux, mais ce n'est pas nécessaire : sans return explicite, 0 sera renvoyé implicitement. Voir : https://gradot.wordpress.com/2013/12...-de-main-en-c/

    @Omah-tn : c'est quoi ton thème Ubuntu ? Au passage, tu devrais rajouter les options -Wall et -Wextra quand tu appelles gcc.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/03/2012, 20h26
  2. Remplir un datagrid avec wpf à partir d'un fichier texte
    Par solim dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 06/05/2011, 10h33
  3. Réponses: 5
    Dernier message: 23/03/2010, 22h03
  4. Réponses: 2
    Dernier message: 11/05/2006, 22h21
  5. Réponses: 3
    Dernier message: 29/03/2006, 14h23

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