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 :

Enregistrement fichier -> Structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut Enregistrement fichier -> Structure
    Bonjour à tous

    Voilà, pour des raisons de traitement, je souhaiterait conserver le contenu d'un fichier dans une structure.
    Ce fichier est une sorte de tableau à 6 colonnes, chaque colonne étant séparée par un espace (" ").
    On a les intitulé suivant : no_pers, prenom, nom, salaire et diplome (ces champs ne figurent pas dans le fichier, mais dans la structure).


    Concrètement, mon fichier (personnel.txt) ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 Jean DUPONT 2500 bac3
    2 Pierre LANIGE 4000 bac5
    3 Michele LEFORT 6000 bac9
    4 Henri WAGNER 2000 bac2
    Dans mon programme C, j'aimerais entrer tout ça sous forme de structure. Pour ça j'ai pensé à un tableau de structure(Salarie tabpersonnel[1000], avec un accès au champs du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabpersonnel[1].nom //(valeur : DUPONT).
    Voilà ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct Salarie Salarie;
    struct Salarie {
    int no_pers;            
    char prenom[30];
    char nom[30];
    int salaire;
    char diplome[30];
    };
     
    Salarie tabpersonnel[1000];
    J'ai choisi de mettre le tout dans une structure pour des raison de facilité de traitement c'est ce qui m'a paru le plus évident), car je souhaiterai après implémenter des fonctions qui renverraient par exemple la personne avec le salaire max, afficher les infos du salarié n° untel, etc. Mais aussi rajouter des salariés, en enlever, etc.
    Mais peut être y'a t-il une autre solution pour effectuer ce genre de traitement ?

    Problème : je souhaite "remplir" ce tableau de structure (une case = un employé) avec les données de mon fichier. Et j'ai un peu de mal à voir comment...

    D'avance merci, si vous pouvez m'éclairer un peu

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Bonjour,

    Je ne suis pas sur d'avoir compris le problème, mais bon ... je vais essayé d'expliquer comment remplir la structure.

    On ouvre un fichier avec fopen.
    Pour faciliter le traitement on va le lire avec fscanf() permettant de convertir certains champs dans les types dont on a besoin. Tout cela grace au format.
    Une fois lu, on met dans la structure.

    Pour le tableau de structure, on peut prendre pas exemple un nombre qui indiquera le nombre d'employé (et donc le nombre la où le tableau s'arrête).
    Pour un programme plus performant mémoire / vitesse ... il serait préferrable d'utiliser une liste chainé.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 16
    Par défaut
    J'ai essayé la solution du fscanf, et elle marche très bien ^^
    Par contre, le seul soucis se pose au niveau de la boucle.

    En effet, pour traiter chaque ligne du fichier, j'utilise une boucle for, où la borne supérieure est le nombre de lignes du fichier.

    Mais vu que le nombre de lignes du fichier est amené à changer par la suite, je souhaiterai avoir une borne supérieure sous forme de variable récupérant ce nombre de lignes, via une fonction.

    Voilà mon code :

    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int cpteLignes(FILE *fic){
      int nblignes =0;
      int c;
      while((c = fgetc(fic)) != EOF){
      if(c == '\n') nblignes++;
      }
      fclose(fic);
      return(nblignes+1);
    }
     
     
    int main()
    {
    struct Salarie {
    int no_pers;
    char prenom[30];
    char nom[30];
    int salaire;
    char diplome[30];
    };
     
     
    struct Salarie tabpersonnel[1000];
     
     
    FILE* fic=NULL;
    fic=fopen("emp.txt", "r+");
    int i, n;
    n=0;
     
    /*Transfert dans la structure */
    if (fic !=NULL){ //si le fichier existe
     
              for(i=0;i<(n=cpteLignes(fic));i++) // avec for(i=0;i<12;i++), ça marche
                {
                    fscanf(fic,"%d %s %s %d %s",&tabpersonnel[i].no_pers, &tabpersonnel[i].prenom, &tabpersonnel[i].nom, &tabpersonnel[i].salaire, tabpersonnel[i].diplome);
                    printf("%d %s %s %d %s\n",tabpersonnel[i].no_pers, tabpersonnel[i].prenom, tabpersonnel[i].nom, tabpersonnel[i].salaire, tabpersonnel[i].diplome);
                }
    }
    printf("%s",tabpersonnel[5].prenom);
    }
    L'affichage est juste là pour vérification.

    Or la fonction me retourne juste :

    0 0
    Si je met à la boucle for :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(i=0;<gras>i<12</gras>;i++)
    Ça marche

    Des pistes ?
    Je pense que le problème est vraiment quelque chose de tout bête... :euh:

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Personnellement, j'utilise feof pour savoir si je suis à la fin du fichier.
    Du coup, je peux me permettre un pour lire le fichier sans en connaitre la longueur.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Personnellement, j'utilise feof pour savoir si je suis à la fin du fichier.
    Du coup, je peux me permettre un pour lire le fichier sans en connaitre la longueur.
    Salut

    Très mauvaise idée. feof() ne sert pas à ça.
    feof() a pour rôle, une fois que la lecture est terminée, d'indiquer si l'arrêt de lecture est dû à une fin de fichier ou pas (ou par exemple erreur).

    La procédure de lecture d'un fichier est
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (fonction_de_lecture(fichier) != valeur_particulière_indiquant_fin_lecture)
    {
         traitement info lue
    }
     
    // Eventuellement, une fois que la lecture est terminé...
    if (feof(fichier))
    {
         ...
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    149
    Par défaut
    Personnellement, je pense à voir la différence entre votre proposition, est une proposition du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char erreur  = 0;
     
    while ( !feof(fichier) && erreur == 0)
    {
       if (fscanf("blabla") != nb_ElemLu )
       { 
          erreur = 1;
       }
    }
    Je pense que le mien est assez safe (habituellement, j'utilise un fgets() à la place du fscanf()).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Enregistrement d'une structure dans un fichier
    Par Portus dans le forum C++
    Réponses: 21
    Dernier message: 30/08/2012, 11h02
  2. [WD17] Enregistrer sur 2 fichiers de structure différente
    Par Rokitdev dans le forum WinDev
    Réponses: 3
    Dernier message: 13/08/2012, 10h31
  3. Comment empêcher users d'enregistrer fichiers lourds sur bureau
    Par kikica dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 14/10/2005, 15h24
  4. Réponses: 9
    Dernier message: 22/09/2005, 16h34
  5. Enregistrement Fichier
    Par TheGoldViking dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/04/2005, 17h32

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