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 :

Enregistrer une struct


Sujet :

C++Builder

  1. #1
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut Enregistrer une struct
    Bonjour,

    Quel est le meilleur moyen d'enregistrer le contenu d'un tableau d'une structure ?
    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
     
    struct _stData {
                         bool bSelected;           
                         char cWord[255];         
                         int iSize;            
                         int iColor;          
                         bool bBold;               
                         bool bItalic;             
                         char cFontName[255];      
                         char cPicture[255];       
                         int iZoom;                     
                         unsigned int iObject;    
                         int iObjectColor;              
                         int iObjectX;                  
                         int iObjectY;                  
                     };
     
    _stData *pData[MAX];

    J'ai essay� ceci, mais ca ne marche vraiment pas bien. Parfois les donn�es sont compl�tement fausses, ou alors le fichier fait planter mon application.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *pFile;
     pFile = fopen(aFileName.c_str(),"wb");
     for (int i=0; i < MAX; i++)
    {
       fwrite(&pData[i], sizeof(_stData), 1, pFile);
    }
    fclose(pFile);
    Merci
    Fred

  2. #2
    Membre �m�rite
    Avatar de bandit boy
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    916
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 916
    Par d�faut
    Salut,
    Une id�e serait de passer par un TStringList. Dans chaque ligne, tu mets une variable (expl:"bSelected=false") et apr�s tu utilises la m�thode SaveToFile.

    Sinon tu peux utiliser un fichier .ini qui peut sauvegarder diff�rent type de variable: chaine, entier ... cette derni�re est simple efficace et assez appropri� pour sauver des variable. Tout est d�crit ici

  3. #3
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    pData est un tableau de pointeurs.
    Tu passe l'adresse des �l�ments de ce tableau � fwrite. C'est pas tr�s logique.
    Il serait plus logique de passer les �l�ment du tableaux qui eux sont sens�s contenir l'adresse de structure _stData.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    fwrite(pData[i], sizeof(_stData), 1, pFile);
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  4. #4
    Membre �m�rite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    F�vrier 2004
    Messages
    644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activit� : Consultant ERP

    Informations forums :
    Inscription : F�vrier 2004
    Messages : 644
    Par d�faut
    Effectivement il s'agit d'un probl�me d'adressage.

    En C et C++, le nom du tableau correspond � l'adresse du premier octet de ce tableau.

  5. #5
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    J'ai encore une petite question concernant le AnsiString.
    Pour enregistrer une variable de type AnsiString, je fais ceci :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    TFileStream *FS = new TFileStream(aFileName, fmCreate);
    AnsiString MaChaine = "blablabla";
    int iSize = MaChaine.Lenght();
    FS->Write(MaChaine.c_str(), iSize);
    delete FS;
    Maintenant je dois r�cup�rer ma chaine, comment dois-je proc�der ?


    Merci

  6. #6
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    Et bien tu reouvre ton fichier en lecture fmOpenRead par exemple.
    et tu utilise la methode Read du TFileStream.


    PS : Ton premier probl�me sa fonctionne ?
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  7. #7
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    1] Pour mon premier probl�me, ca faisait toujours pareil. Parfois ca marchait, parfois il me manquait des donn�es. J'ai donc enregistr� �l�ment par �l�ment via la fonction TFileStream.

    2] Qu'elle est la meilleure fa�on de lire un AnsiString avec la fonction Read de TFileStream ?
    Comme ceci ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    TFileStream *FS = new TFileStream(aFileName, fmOPenRead);
    AnsiString MaChaine = "";
    int iSize = 0;
    FS->Read(&iSize, sizeof(int));
    FS->Read(&MaChaine, iSize);
    delete FS;
    Merci

  8. #8
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    Qu'elle est la meilleure fa�on de lire un AnsiString avec la fonction Read de TFileStream ?
    Comme ceci ?...
    Tu as test� ton bout de code ? il fonctionne ?


    Tu peut faire un truc dans ce genre :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       #define BUFFER_SIZE 256   //Taille du buffer.
    
       char Buffer[BUFFER_SIZE];
       AnsiString st;
       TFileStream *FS = new TFileStream("texte.txt", fmOpenRead);
       int nbcharlu;
       do {
           nbcharlu = FS->Read(Buffer,BUFFER_SIZE);
           if(nbcharlu<BUFFER_SIZE) Buffer[nbcharlu]=0;
           st += String(Buffer);
       } while(nbcharlu==BUFFER_SIZE);
    
       delete FS;
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  9. #9
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    J'ai fais comme ceci, pour l'instant ca � l'air de bien fonctionner.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    TFileStream *FS = new TFileStream("texte.txt", fmOpenRead);
    AnsiString aBuffer="";
    int iSize = 0;
    FS->Read(&iSize,sizeof(int));
    aBuffer.SetLength(iSize);
    FS->Read(aBuffer.c_str(),iSize);
    delete FS;

  10. #10
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    ESt-ce que vous penser que ce code est bon ?
    Pour l'instant ca marche bien, mais je ne suis pas sur ......
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int iSize = 0;
    FS->Read(&iSize,sizeof(int));
    aBuffer.SetLength(iSize);
    FS->Read(aBuffer.c_str(),iSize);

  11. #11
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    Ton code suppose que tu est enregistr� la taille du fichier au d�but du fichier. Est-ce exact.

    Pour c_str() je ne sait pas trop.
    Citation Envoy� par Aide BCB
    La m�thode c_str est fournie d'abord pour la lecture de la valeur de l'AnsiString. Pour modifier la valeur de la cha�ne, utilisez l'op�rateur [] ou les m�thodes AnsiString comme Insert et Delete.
    PS : Si ton fichier ne contient que des chaines de caract�res tu peut aussi utiliser la TStringList. Elle est plus simple d'utilisation en ce cas l�.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  12. #12
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    Ton code suppose que tu est enregistr� la taille du fichier au d�but du fichier. Est-ce exact.
    Non, je n'ai pas �crit la taille du fichier

    Mon fichier contient un m�lange de AnsiString, Int et Float.
    J'ai essay� ceci, mais ca ne compile pas, c'est pour cela que j'ai mis aBuffer.c_str() :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    int iSize = 0;
    FS->Read(&iSize,sizeof(int));
    aBuffer.SetLength(iSize);
    FS->Read(aBuffe[0],iSize);

  13. #13
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    J'ai l'impr�ssion que tu m�lange un peu tout.
    A tu regard� un peu l'aide des classes que tu utilises.

    Les AnsiString encapsule des cha�nes de caract�res et tu veux y mettre un peu de tout.

    Dans ton bout de code tu lit un entier (int) que tu mets dans la variable
    iSize donc ton fichier est suppos� contenir un entier au d�but.
    (Vu son nom, elle � l'air de repr�senter une taille.)

    Ensuite tu (essais) de lire iSize octets (Moi je croyais que c'etait la taille du fichier c'est pour cela que je t'en parlais)

    Donc si tu as plusieurs type variables m�lang�es il faut les lire dans le m�me ordre qu'elle ont �t� enregistr�e. Comme tu l'as fait pour ta variable iSize.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  14. #14
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    En fait le iSize en d�but de fichier correspond � la taille d'un AnsiString qui suit juste apr�s. Je me suis peut-�tre mal expliqu�, d�sol�.
    Ce que je voulais savoirc' est comment r�cup�rer un AnsiString dans un fichier binaire.

    Pour �crire dans mon fichier, j'ai fais ceci : pas de probl�me pour �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    TFileStream *FS = new TFileStream("texte.txt", fmCreate);
    AnsiString aBuffer="Ici quelque chose dans mon AnsiString";
    int iSize = aBuffer.Lenght();
    FS->Write(&iSize, sizeof(int)); //J'écris la taille de mon AnsiString
    FS->Write(aBuffer.c_str(), iSize); //J'écris iSize octets de mon AnsiString
    FS->Write(&MyFLoat, sizeof(float));
    .../... //J'écris divers float et int dans mon fichier
    delete FS;
    Et pour lire je fais ceci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TFileStream *FS = new TFileStream("texte.txt", fmOpenRead);
    AnsiString aBuffer=""; 
    int iSize = 0;
    FS->Read(&iSize,sizeof(int)); // Je recupère la taille de mon AnsiString
    aBuffer.SetLength(iSize); //Je change la taille de aBuffer
    FS->Read(aBuffer.c_str(), iSize); // Je lit iSize octets pour mon AnsiString
    FS->Read(&MyFLoat, sizeof(float));
    .../... //Je lis les divers float et int dans mon fichier
    delete FS;
    Ce code marche bien pour l'instant. J'aurais voulu avoir une confirmation que ce code soit correcte, car je ne voudrais pas avoir des surprises plus tard.... a cause de FS->Read(aBuffer.c_str(), iSize); que je ne sais pas si c'est valable ou pas.

    Merci

  15. #15
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Par d�faut
    Comme je t'ai dit plus haut :
    Pour c_str() je ne sait pas trop.

    Citation Envoy� par [B
    Aide BCB[/B]]
    La m�thode c_str est fournie d'abord pour la lecture de la valeur de l'AnsiString. Pour modifier la valeur de la cha�ne, utilisez l'op�rateur [] ou les m�thodes AnsiString comme Insert et Delete.
    Donc il serait peut-�tre mieux de passer par un buffer de char.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  16. #16
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    332
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2003
    Messages : 332
    Par d�faut
    Bonjour,

    Aurais-tu STP un petit exemple, car je n'arrive pas � r�cup�rer la chaine compl�te ?

    Je te remercie

Discussions similaires

  1. implementer une struct dans un .c
    Par jamal dans le forum C
    R�ponses: 10
    Dernier message: 10/03/2005, 19h52
  2. Pb lecture d'une struct date
    Par smag dans le forum C++
    R�ponses: 13
    Dernier message: 03/03/2005, 22h17
  3. mettre les termes d'un string dans une struct
    Par grand's dans le forum SL & STL
    R�ponses: 17
    Dernier message: 29/11/2004, 17h43
  4. Enregistrer une vid�o...
    Par Ptibibi dans le forum DirectX
    R�ponses: 3
    Dernier message: 09/06/2004, 18h06
  5. enregistrer une image et un identifiant
    Par dosach dans le forum MS SQL Server
    R�ponses: 6
    Dernier message: 18/03/2004, 17h18

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