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 �prouv�
    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
    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
    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 Expert
    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
    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 �prouv�
    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
    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 �prouv�
    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
    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 Expert
    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
    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 �prouv�
    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
    Par d�faut
    ok... je crois que je vois ce que vous voulez dire ...

    merci...

  9. #9
    Membre Expert
    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
    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