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 :

Ecriture d'un tableau de structure dans un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 35
    Billets dans le blog
    1
    Par défaut Ecriture d'un tableau de structure dans un fichier
    Bonjour à tous,

    Je suis programmeur débutant en c,j'étudie en ce moment les fichiers.

    Le problème que je voudrais vous soumettre est l'écriture dans un fichier,d'un tableau de structure..

    je vous présente mon code.
    En premier ma bibliothèque contact.h
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define Max 1
    #define TAILLE_MAX 1000
     
    int verif(int *test);
    typedef struct Personne Personne;
    struct Personne
    {
        char nam[20];
        char pre[15];
        int  age;
        int  tel;
        int  id;
    };
     
    void cREATCONTACT(FILE *fiche,Personne *info,int taille);
    void controlsaisie(Personne *tab,int tal);
    void lIRECONTACT(FILE *fiche,Personne *info,int taille);
    void rECHERCHECONTACT(FILE *fiche,Personne *info,int taille);
    Ici le main.c
    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
     
    #include"contact.h"
     
    int main()
    {
            FILE *Fichier=NULL;
            Personne contact[Max];
     
            int choix;
            int *pointchoix=&choix;
            while(choix!=4)
                 {
                     printf("*****Bienvennue dans la gestion des contacts***\n\a");
                     system("cls");
                     printf("****** MENU******\n");//menu de gestion
                     system("pause");
     
                     switch(verif(pointchoix))
                     {
                                    case 1:
                                          controlsaisie(contact,Max);
                                          cREATCONTACT(Fichier,contact,Max);
                                    break;
                                    case 2:
                                            lIRECONTACT(Fichier,contact,Max);
                                    break;
                                    case 3:
                                         rECHERCHECONTACT(Fichier,contact,Max);
                                    break;
                                    case 4:
     
                                            printf("Au revoir et merci \t");
                                            system("pause");
                                    break;
     
     
                     }
               }
               return 0;
    }
        int verif(int *test)//Fonction de gestion  du menu
        {
                int x;
                x=0;
     
            while(x<1 || x>4)
            {
             system("cls");
             printf("1-Creation d un contact\a\n");//Controle
             printf("\n\n");
             printf("2-Visualisation des contacts\n");
             printf("\n\n");
             printf("3-Recherche contact\n");
             printf("\n\n");
             printf("4-Quitter\n");
             printf("\n\n");
             printf("Faites votre choix svp\?\n");
             fflush(stdin);
             scanf("%d",&x);
             system("pause");
             }
             *test=x;
             return *test;
        }
    Les fonctions
    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
     
    #include"contact.h"
     
    void cREATCONTACT(FILE *fiche,Personne *info,int taille)//creation fichier
    {
        int i;
        //char ligne[80];
    //for(i=0;i<=taille;i++)
            //{
     
                fiche=fopen("c:\\Codblock\\Contacttel\\Contact.txt","a+");
                if(fiche!=NULL)
                {
     
     
                        system("cls");
                        fwrite(info,sizeof(info[0].id),sizeof(info)/sizeof(info[0].id),fiche);
                         fclose(fiche);
     
     
                }
     
     
                else
                {
                    printf("erreur");
                }
        //}
    }
    void controlsaisie(Personne *tab,int tal)
    {
        int j,k;
        char saisie[11];
       // for(j=0;j<=tal;j++)
        //{
                while(1)
                {
                    printf("Rentrez ID du contact\t:\n");
                    fflush(stdin);
                    fgets(saisie,11,stdin);
                    if(sscanf(saisie,"%3d", &k)==1)//saisie controle age
                    {
                        tab->id=k;
                         break;
                    }
                    printf("Erreur rentrez un identifiant  svp\n");
                }
                printf("Rentrez le nom du contact %d:\t",j+1);
                fflush(stdin);//vider tampon
                fgets(tab[0].nam,20,stdin);
                printf("Rentrez le prenom du contact:\t");//Saisie nom et prenom
                fgets(tab[0].pre,15,stdin);
                while(1)
                {
                    printf("Rentrez le telephone du contact\t:\n");
                    fflush(stdin);
                    fgets(saisie, 11, stdin);
                    if(sscanf(saisie,"%11d",&k)==1)
                    {
                      tab[0].tel=k;//saisie telephone
                      break;
                    }
                    printf("Erreur rentrez un numero de telephone");
                }
                while(1)
                {
                    printf("Rentrez l age du contact\t:\n");
                    fflush(stdin);
                    fgets(saisie,11,stdin);
                    if(sscanf(saisie,"%3d", &k)==1)//saisie controle age
                    {
                        tab[0].age=k;
                         break;
                    }
                    printf("Erreur rentrez un nombre pour l age svp\n");
                }
      //  }
    }
    Mon problème se situe au niveau de l'écriture du tableau de structure ,l'écriture de celui ci dans le fichier.Pouvez vous m'aider.

    Toutes remarque sur mon code ou ma réflexion algorithmique est la bienvenue.

    Merci d avance

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(info,sizeof(info[0].id),sizeof(info)/sizeof(info[0].id),fiche);
    Qu'essayes-tu de faire ?
    Ne serait-ce pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(info,sizeof(*info), nbPersonneQueTuVeuxEcrireDansTonFichier ,fiche);

  3. #3
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 35
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Il s'agit d'un tableau de structure,donc me suis inspirer d'un élément du tutoriel sur les fichiers en c.
    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
     
    IX-A - Enregistrement et chargement de données (VIII-A)
    Ecriture du tableau
    #include <stdio.h>
    int main()
    {
    FILE * f = fopen("test.tab", "wb");
    if (f == NULL)
    perror("test.tab");
    else
    {
    int tab[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    fwrite(tab, sizeof(tab[0]), sizeof(tab) / sizeof(tab[0]), f);
    fclose(f);
    printf("Termine.\n");
    }
    return 0;
    }
    Chargement du tableau
    #include <stdio.h>
    #include <string.h>
    int main()
    {
    FILE * f = fopen("test.tab", "rb");
    if (f == NULL)
    perror("test.tab");
    else
    {
    int n, i, tab[10];
    n = fread(tab, sizeof(tab[0]), sizeof(tab) / sizeof(tab[0]), f);
    for(i = 0; i < n; i++)
    printf("%d\n", tab[i]);
    fclose(f);
    }
    return 0;
    }
    IX-B - Taille d'un fichier (VIII-B)
    Je pensais que puisqu'il s 'agissait d'une insertion d'un tableau, dans un fichier
    avec fwrite.
    Une modification de celle ci pour l 'adapter à un fichier de structure aurais marcher.

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

    Sauf que sizeof(tab) / sizeof(tab[0]) appliqué à int tab[10] n'est pas la même chose que sur int *tab.

    Je te laisse regarder ce que retourne :
    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
    #include <stdio.h>
     
    void printSize(int * tab) 
    {
        printf("Taille : %d\n", sizeof(tab) / sizeof(tab[0])); 
    }
     
    int main()
    {
        int tab[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        printf("Taille : %d\n", sizeof(tab) / sizeof(tab[0]));
        printSize(tab);
     
        return 0;
    }
    Et tu commets la même erreur dans ton code.
    Utilise le paramètre taille

  5. #5
    Membre averti

    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 35
    Billets dans le blog
    1
    Par défaut
    Ok,

    j'ai remarqué la différence.
    en fouinant sur le net j'ai découvert ce 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
     
        #include <stdio.h>  
        #include <string.h>  
     
        typedef struct {  
            char nom[64];  
            char prenom[64];  
        } etudiant;  
     
        int main() {  
     
            etudiant e[2];  
     
            FILE *f = fopen("a.bin", "wb");  
     
            strcpy(e[0].nom, "Zick");  
            strcpy(e[0].prenom, "Zack");  
     
            strcpy(e[1].nom, "Zock");  
            strcpy(e[1].prenom, "Zuck");  
     
            fwrite(e, 2 * sizeof(etudiant), 1, f);  
     
            fclose(f);  
     
            return 0;  
     
        }
    Ce code ma donné un idée sur l'utilisation de fwrite avec une structure,mais je n arrive toujours pas à comprendre cette utilisation avec sizeof.

  6. #6
    Expert confirmé
    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
    Par défaut
    Dans fwrite(), tu dois spécifier la taille en bytes d'un élément et le nombre d'éléments à écrire. Elle retourne le nombre d'éléments effectivement écrit (qui sera inférieur au nombre demandé seulement en cas d'erreur d'écriture)

    La taille en byte d'un objet X de type T est donnée par sizeof X ou sizeof(T).

    Si je veux écrire N éléments de type T figurant dans un tableau Tab, j'aurais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite(Tab, sizeof(T), N,...);
    On peut faire des variations sur le thème :
    - au lieu de sizeof(T), on peut écrire sizeof *Tab ou sizeof tab[0] puisque les objets *Tab ou Tab[0] (c'est la même chose) sont de type T
    - Si on veut écrire le tableau en entier, on peut faire calculer le nombre d'éléments par sizeof Tab/sizeof *Tab (nombre total de bytes du tableau/taille en byte d'un élément)

    Et ceci est valable quel que soit le type T donc également si T est une structure.

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

Discussions similaires

  1. tableau de structure dans une structure
    Par igloo2 dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2013, 18h25
  2. Tableau de structures dans une structure
    Par adrienmgs dans le forum Débuter
    Réponses: 8
    Dernier message: 03/04/2011, 00h48
  3. Tableau de structures dans un fichier
    Par tchezan dans le forum Débuter
    Réponses: 7
    Dernier message: 12/04/2010, 12h15
  4. Réponses: 4
    Dernier message: 29/04/2008, 09h52
  5. Réponses: 1
    Dernier message: 29/06/2007, 15h13

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