Récupération de donnée structurée dans un fichiers

Résolu
corrsinlove Messages postés 3 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 8 juin 2008 - 8 juin 2008 à 03:44
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 8 juin 2008 à 14:02
Bonjour j'ai une question concernant la récupération de donnée structuré dans un fichier, je n'ai pas eu de souçi pour le fwrite mais pour le fread la fenêtre s'ouvre puis se ferme immédiatement malgré le systeme("pause"), je ne peut donc pas  savoir à l'aide du printf si les données ont bien été récupérées. Est ce que j'ai omis quelque chose?
voici le code:
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *sp=fopen("spectacle.dat","r+b"); /*fichier contenant le nombre d'events*/
    FILE *pe=fopen("event.dat","r+b");     /*fichier ou l'on saisie les events*/

    fseek(sp,0,SEEK_SET);  
    fseek(sp,0,SEEK_SET);  

    int i, tot_event;

    struct evenement
    {
    char show [30];                /*structure event*/
    int mois;
    int jour;
    };
   
    evenement actu[tot_event];

    if (sp != NULL)
    {  fread(&tot_event,sizeof(int), 1, sp);
    printf("%d",tot_event);
         fclose(sp);
    }       
     
    if (pe != NULL)
    {   
        /*les données ont été saisie avec un fwrite*/
        for(i=1;i<tot_event;i++)
        {
        fread(&actu[i],sizeof(struct evenement), 1, pe);
        printf("%s %d %d",actu[i].show, actu[i].mois, actu[i].jour);
        }
    }
    fclose(pe);

system("PAUSE");

   return 0;
}

si quelqu'un a une idée... merci d'avance :-)

4 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
8 juin 2008 à 10:50
Bonjour,

Plusieurs remarques :

1) Inutile de faire un "fseek(sp,0,SEEK_SET); " après un fopen, le curseur est deja en début de flux lors du fopen. En plus tu le fais deux fois pour le meme flux
.... 

2) Tu déclares un tableau evenement avecune taille tot_event, alors que tot_event n'est pas initialisé....

Pour lire de tel fichier il est inutile de se trimballer un fichier event.dat.
Pour connaitre le nombre de structure contenu dans le fichier, tu récupères la taille du fichier et tu la divise par sizeof(evenement).
De cette manière tu t'évites une lecture supplémentaire. et tu peux initialiser ton tableau après la récuprétation de la taille.

Shell
3
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 juin 2008 à 11:52
Bonjour,

Et quand on ouvre un fichier, on teste l'ouverture tout de suite ! Pas une douzaine d'instructions après pendant lesquelles on a utilisé le fichier !!! (même si ici c'est un fseek() inutile).

Jean-François
0
corrsinlove Messages postés 3 Date d'inscription samedi 3 décembre 2005 Statut Membre Dernière intervention 8 juin 2008
8 juin 2008 à 13:12
j'ai modifié le code, ca s'execute (ca n'indique pas encore les bonnes valeurs mais je ne suis pas loin..)
par contre je ne vois pas comment récuperer la taille du fichier, en cherchant sur google, il précise qu'il faut créer une structure et utiliser une bibliotheque, y'a pas un moyen plus simple comme ftell ?

#include <conio.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE* sp = NULL;
    FILE* pe = NULL;
    
    sp=fopen("spectacle.dat","r+b");
    pe=fopen("event.dat","r+b");     /*fichier ou l'on saisie les events*/

    int i, tot_event;   /*i et tot_event sont initialisées*/

    struct evenement
    {
    char show [30];                /*structure event*/
    int mois;
    int jour;
    int place_reserve[50][60];    /*un tableau de place*/
    };

    
    
if (errno==0)   
  {  
    if (sp != NULL)
    {  
             
             fread(&tot_event,sizeof(int), 1, sp);
             printf("%d",tot_event);
             fclose(sp);
    }       
     
    
    evenement actu[tot_event];
    
    if (pe != NULL)
    {   

        fread(&actu[1],sizeof(struct evenement), 1, pe);
        printf("%s %d %d",actu[1].show, actu[1].mois, actu[1].jour);
        
    }
    fclose(pe);

}else perror("erreur ouverture");    

system("PAUSE");

   return 0;
}
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
8 juin 2008 à 14:02
Je me demande ce que cela peut bien exécuter car tout est faux !

En ce qui concerne la taille d'un fichier : CreateFile() + GetFileSize() + CloseHandle() dans windows.h

Jean-François
0
Rejoignez-nous