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++Builder Discussion :

Problème de rangement de structure dans un fichier ...


Sujet :

C++Builder

  1. #1
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut Problème de rangement de structure dans un fichier ...
    bon je vous explique mon souci, surement que ca doit pas etre grand chose, mais je trouve vraiment pas d'ou ca vient :
    en fait je range une liste de structure (TList) dans un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    blabla... (création,ouverture fichier:fic)
     
    x=ListeStruct->Count;
    FileWrite(fic,&x,sizeof(int));
     
    for (int i=0;i<ListeStruct->Count;i++)
       FileWrite(fic,(STRUCT *)ListeStruct->Items[i],sizeof(STRUCT));
    et ensuite je viens les relire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    blabla... (vérification d'existence fichier, ouverture fichier:fic)
     
    ListeStruct->Clear();
     
    FileRead(fic,&x,sizeof(int));
     
    for (int i=0;i<x;i++)
       {
        PtSTRUCT=new STRUCT;
        FileRead(fic,PtSTRUCT,sizeof(STRUCT));
        ListeStruct->Add(PtSTRUCT);
        }
    et la, enfer et putrefaction... je ne retrouve pas ma structure comme je voudrais, est-ce que quelque chose m'échappe... ( j'ai pas trop l'habitude de faire comme ca, alors j'ai peut etre fait une connerie !! )

    Merci d'avance ...

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Décris-nous ta structure s'il te plaît.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    une petite erreur lors de l'écriture du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for (int i=0;i<ListeStruct->Count;i++) 
       FileWrite(fic,(STRUCT *)ListeStruct->Items[i],sizeof(STRUCT));
    utilise plutôt une variable intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    STRUCT * toto
    for(int n=0;n<Count;n++)
       {
         toto=(STRUCT *)mList->Items[n];
         FileWrite(FileHandle,toto,sizeof(TMstruct));
       }
       FileClose(FileHandle);
    lecture

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int Count;
    FileRead(FileHandle,&Count,sizeof(int));
       for(int n=0;n<Count;n++)
       {
         toto=new STRUCT ;
         FileRead(FileHandle,toto,sizeof(STRUCT));
         mList->Add(toto);
       }
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  4. #4
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    Merci de votre interet pour cette question mais quelque chose m'échappe encore, ce doit etre la, sous mes yeux, mais je n'arrive pas à mettre la main dessus, je vous donne le code exact, tel que je l'ai écrit :

    pour la structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct
       {
       AnsiString titre;
       AnsiString chemin;
       int longueur;
       }CHANSON;
     
    CHANSON *PtCHANSON;
    pour l'enregistrement de la liste de structures :

    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
     
    AnsiString nom[2];
       int fic;
       char name[200],name1[200];
     
       nom[0]=ChangeFileExt(Application->ExeName,".lst");
       nom[1]=ChangeFileExt(Application->ExeName,".bak");
     
       lstrcpy(name,nom[0].c_str());
       lstrcpy(name1,nom[1].c_str());
     
       if (FileExists(name))
          {
          DeleteFile(name1);
          RenameFile(name,name1);
          }
       fic=FileCreate(name);
     
       int x;
       if (fic!=-1)
          {
          x=ListeChanson->Count;
          FileWrite(fic,&x,sizeof(int));
     
          for (int i=0;i<ListeChanson->Count;i++)
             {
             PtCHANSON=(CHANSON *)ListeChanson->Items[i];
             FileWrite(fic,PtCHANSON,sizeof(CHANSON));
             }
     
          FileClose(fic);
          }
    pour la relecture de la liste de structures :

    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
     
    ListeChanson->Clear();
     
       AnsiString nom;
       int fic,x;
       char name[200];
     
       nom=ChangeFileExt(Application->ExeName,".lst");
     
       lstrcpy(name,nom.c_str());
     
       if (FileExists(name))
          {
          // Ouvrir le fichier
          fic=FileOpen(name,fmOpenRead);
     
          FileRead(fic,&x,sizeof(int));
     
          for (int i=0;i<x;i++)
             {
             PtCHANSON=new CHANSON;
             FileRead(fic,PtCHANSON,sizeof(CHANSON));
             ListeChanson->Add(PtCHANSON);
             }
     
          FileClose(fic);
          }
    je pense que l'écriture se passe bien ... car le fichier est bien généré...
    quand à la lecture... violation d'acces... etc,etc... rtl60... etc,etc...

    merci de votre aide... je suis sur que ca doit etre evident...

  5. #5
    mat.M
    Invité(e)
    Par défaut
    Il faudrait peut-être écrire d'abord le nombre de noeuds de la liste retourné par TList::Count !!!
    Parce que comment fixer le nombre d'éléments de la liste à la lecture ??
    Ecrire d'abord nombre d'éléments
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CHANSON instance_locale_chanson;
    FILE *fichier=fopen("donnees.dat","rb");
    int NbreElements=ListeStruct->Count ;// verifier si cela ou bien -1
    fprintf( fichier,"%i",NbreElements);
    for(int i =0;i<ListeStruct->Count ;i++)
    {
    CHANSON=ListeStruct->Items[i];
    &instance_locale_chanson=CHANSON;// definir au prealable l'operateur //= //de la classe 
    fwrite (f,instance_locale_chanson,sizeof(CHANSON),1);
     
    }
    Et pour la lecture il suffit de lire d'abord le nombre d'éléments avec scanf , puis d'allouer , en fonction de ce nombre les noeuds de la liste .
    Sinon on peut aussi utiliser ifstream ofstream.


    C'est comme cela que j'ai procédé pour un de mes freeware....

  6. #6
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par mat.M
    Il faudrait peut-être écrire d'abord le nombre de noeuds de la liste retourné par TList::Count !!!
    Parce que comment fixer le nombre d'éléments de la liste à la lecture ??
    ben je crois que c'est ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    x=ListeChanson->Count; 
    FileWrite(fic,&x,sizeof(int));

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    eh bien non l'écriture ne se passe pas très bien
    le sizeof de ta structure est égal a 12 soit 3 Pointeurs
    tu sauvegardes donc 3 pointeurs sur ton fichier et non pas leur contenu
    attention les AnsiStrings sont des classes il est préférable dans une structure d'utiliser des tableaux de caractères

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre habitué
    Avatar de Freeze
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 131
    Points : 162
    Points
    162
    Par défaut
    ok... je crois que je vois ce que vous voulez dire ...

    merci...

  9. #9
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut ci joint un code fonctionel
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       AnsiString nom[2];
       int fic;
       char name[200],name1[200];
     
       nom[0]=ChangeFileExt(Application->ExeName,".lst");
       nom[1]=ChangeFileExt(Application->ExeName,".bak");
     
       lstrcpy(name,nom[0].c_str());
       lstrcpy(name1,nom[1].c_str());
     
       if (FileExists(name))
          {
          DeleteFile(name1);
          RenameFile(name,name1);
          }
       fic=FileCreate(name);
     
       int x;
       if (fic!=-1)
          {
          x=ListeChanson->Count;
          FileWrite(fic,&x,sizeof(int));
          long RecLength;
          for (int i=0;i<ListeChanson->Count;i++)
           {
             PtCHANSON=(CHANSON *)ListeChanson->Items[i];
             RecLength=ComputeSize(*PtCHANSON);
             FileWrite(fic,&RecLength,sizeof(long));
             FileWrite(fic,PtCHANSON->titre.c_str(),PtCHANSON->titre.Length()+1);
             FileWrite(fic,PtCHANSON->chemin.c_str(),PtCHANSON->chemin.Length()+1);
             FileWrite(fic,&PtCHANSON->longueur,sizeof(PtCHANSON->longueur));
            }
          FileClose(fic);
          }
       ClearMemor();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ClearMemor()
    {
     for(int n=0;n<ListeChanson->Count;n++)
       delete ListeChanson->Items[n];
     ListeChanson->Clear();
    }
     
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
     
       long RecLength;
       AnsiString nom;
       int fic,x;
       char name[200];
       ClearMemor();
       nom=ChangeFileExt(Application->ExeName,".lst");
     
       lstrcpy(name,nom.c_str());
     
       if (FileExists(name))
          {
          // Ouvrir le fichier
          fic=FileOpen(name,fmOpenRead);
     
          FileRead(fic,&x,sizeof(int));
          char* tmp;
          for (int i=0;i<x;i++)
             {
             FileRead(fic,&RecLength,sizeof(long));
             char *buffer =new char[RecLength];
             tmp=buffer;
             FileRead(fic,buffer,RecLength);
             PtCHANSON=new CHANSON;
             PtCHANSON->titre=tmp;
             tmp+=strlen(tmp)+1;
             PtCHANSON->chemin=tmp;
             tmp+=strlen(tmp)+1;
             PtCHANSON->longueur=*tmp;
             delete []buffer;
             ListeChanson->Add(PtCHANSON);
             }
     
          FileClose(fic);
          }
     
    }
    //---------------------------------------------------------------------------
    long __fastcall TForm1::ComputeSize(CHANSON & Value)
    {
     long RetVal=0;
     RetVal+=Value.titre.Length()+1;
     RetVal+=Value.chemin.Length()+1;
     RetVal+=sizeof(Value.longueur);
     return RetVal;
     
    }
    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2013, 14h44
  2. Réponses: 17
    Dernier message: 09/03/2007, 18h13
  3. stocker une structure dans un fichier ini?
    Par Mickey.jet dans le forum C
    Réponses: 6
    Dernier message: 13/09/2006, 16h57
  4. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30
  5. Réponses: 11
    Dernier message: 13/10/2004, 00h58

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