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 :

Fichier binaire et structure


Sujet :

C++Builder

  1. #1
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut Fichier binaire et structure
    Bonjour,

    J'essaie de construire un fichier binaire avec une structure. C'est un essai.

    Lors de l'ouverture, j'ai comme message d'erreur : "Abnormal program termination"

    Curieusement, si je retire la ligne ListBox2->Items->Add(personnes.nom + " " + personnes.ville+ " " +IntToStr(personnes.num) );
    Pas de message d'erreur.

    J'aimerais utiliser mon fichier de fa�on classique :
    - Enregistrer
    - Modifier (avec Fseek ?)
    - Supprimer (avec Fseek ?)

    Je cherche des solutions sur le net, pas moyen ... et je rame

    Ci-dessous mon code.

    Si vous avez une solution, merci d'avance.

    Cordialement

    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
     
    struct PERSONNE
     {
      String nom;
      String ville;
      int num;
     };
     PERSONNE personnes;
     int pos;
     
    void __fastcall TForm2::EnregistrerStructClick(TObject *Sender)
    {
       // Ecriture
     
      int i;
     
      ofstream fichier ("Repertoire.xyz", ios::out | ios :: app);
     
     
      if(!fichier.is_open())
     
    	 {
    	  ShowMessage ("Impossible de créer le fichier");
    	  return;
    	 }
     
      else
    	{
    	  personnes.nom = Edit2->Text;
    	  personnes.ville = Edit3->Text;
    	  personnes.num = pos;
    	  pos+=1;
    	  fichier.write ((char *)&personnes, sizeof(PERSONNE));
    	}
     
    	fichier.close();
    }
     
    void __fastcall TForm2::OuvertureStructClick(TObject *Sender)
    {
     ListBox2->Clear();
      int i;
     
     ifstream fichier ("Repertoire.xyz", ios::in );
     
     
     if (!fichier.is_open())
     
    	 {
    	  ShowMessage ("Impossible d'ouvrir le fichier");
    	  return;
    	 }
      else
     
       {  while (!fichier.eof())
    	 {
    	  fichier.read ((char *)&personnes, sizeof(PERSONNE));
    	  ListBox2->Items->Add(personnes.nom + " " + personnes.ville+ " " +IntToStr(personnes.num) );
    	 }
       }
     
      fichier.close();
     
     }

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    On ne peut pas faire fichier.write ((char *)&personnes, sizeof(PERSONNE)); et encore moins fichier.read ((char *)&personnes, sizeof(PERSONNE));. Le fait d'avoir utilis� le cast du C au lieu du cast C++ emp�che le compilateur de pr�venir de l'�normit�.
    Ces fonctions attendent des suites d'octets en param�tres, mais ta struct PERSONNE n'est pas ce que l'on appelle un "POD", en prendre la taille ne correspond pas du tout � ce qu'il y a � l'int�rieur. Les donn�es internes sont des pointeurs dans la m�moire et copier ces pointeurs ne correspond � rien. Les relire est encore plus grave, c'est pourquoi imm�diatement apr�s cette lecture le code ne peut que planter lamentablement.
    Pour �crire la structure, on peut utiliser une structure au format C, l� �a marchera.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    struct PERSONNE {  // Ça c'est un "POD" mais ça n'est plus vraiment du C++
      char nom[20];
      char ville[20];
      int num;
     };
    Ou bien il faut un moyen de s�rialiser et d�s�rialiser ta structure

  3. #3
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Bonjour Dalfab.

    Merci. J'ai essay� avec char mais il y a toujours une erreur au niveau de ListBox2->Items->Add(personnes.nom + " " + personnes.ville+ " " +IntToStr(personnes.num) );

    [bcc32 Erreur] Fich.cpp(209): E2085 Addition de pointeur incorrecte
    Contexte d'analyseur complet
    Fich.cpp(193): analyse : void _fastcall TForm2::OuvertureStructClick(TObject *)
    [bcc32 Erreur] Fich.cpp(254): E2277 Lvalue n�cessaire

    J'ai converti char en String(personnes.nom), toujours la m�me erreur.

    Le code ci-dessous ne marche pas mieux, toujours une erreur � cause de la ligne ListBox2->Items->Add(personnes.nom + " " + personnes.ville + " " +IntToStr(personnes.num));
    Si je la supprime, pas d'erreur.

    Cordialement

    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
     
    struct PERSONNE
     {
      String nom;
      String ville;
      int num;
     };
     PERSONNE personnes;
     int pos;
     
    void __fastcall TForm2::EnregistrerStructClick(TObject *Sender)
    {
       // Ecriture
    FILE * fichier;
    	fichier = fopen ("Repertoire.xyz", "ab");
     
      if (fichier == NULL) ShowMessage("Impossible d'ouvrir le fichier");
     
    	 else
    	 {
    	  personnes.nom = Edit2->Text;
    	  personnes.ville = Edit3->Text;
    	  personnes.num = pos;
    	  pos+=1;
    	  fwrite (&personnes,sizeof(PERSONNE),1,fichier);
    	  ListBox1->Items->Add(personnes.nom + " " + personnes.ville+ " " +IntToStr(personnes.num) );
    	 }
     
       fclose(fichier);
     
     }
     
    void __fastcall TForm2::OuvertureStructClick(TObject *Sender)
    {
     ListBox2->Clear();
     
     FILE * fichier;
     fichier = fopen ("Repertoire.xyz", "rb");
     
      if (fichier == NULL) ShowMessage("Impossible d'ouvrir le fichier");
     
      else
     {
       while (! feof(fichier))
    	{
    		{
    		fread(&personnes,sizeof(PERSONNE),1,fichier);
    		ListBox2->Items->Add(personnes.nom + " " + personnes.ville + " " +IntToStr(personnes.num));
    		}
    	}
     
     }
    	fclose (fichier);
     
     }

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Citation Envoy� par magdani Voir le message
    Si je la supprime, pas d'erreur.
    Quelle erreur? une erreur � l'ex�cution (est-ce "Abnormal program termination"?) ou une erreur de compilation?

    On ne peut pas additionner des char*, mais on peut concat�ner un String avec un char*, il faut convertir au moins un �l�ment sur deux en String:
    ListBox2->Items->Add( String(personnes.nom) + " " + String(personnes.ville) + " " + IntToStr(personnes.num) );

  5. #5
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Merci dalfab.

    Plus de plantage : personnes.num s'affiche bien dans listbox

    Par contre, toujours un probl�me avec les cha�nes de caract�res.

    personnes.nom = Edit2->Text; [bcc32 Erreur] Fich.cpp(253): E2277 Lvalue n�cessaire
    Normal, incompatibilit� entre char et string.

    J'ai essay� de convertir string en char

    strcpy(personnes.nom,Edit2->Text.c_str()); [bcc32 Erreur] Fich.cpp(252): E2342 Mauvaise correspondance de type dans le param�tre '__src' ('const char *' d�sir�, 'wchar_t *' obtenu)

  6. #6
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Si � un moment on a besoin de wchar_t, il est pr�f�rable de ne pas utiliser les char mais des wchar_t � la place.
    - les strcpy() deviennent alors des wcscpy(),
    - les "...." deviennent des L"....."
    - ... �a devient compliqu�. ...

    On peut passer par les AnsiString qui devraient permettre de convertir les String en char* et inversement.

    On bien on peut se poser la question ne ne pas utiliser un tableau au format C, d'oublier les char et wchar_t, apprendre le langage C est peut-�tre de trop! On peut revenir � s�rialiser les �critures des String. Il doit y avoir des outils sous C++ Builder pour faciliter cela.

  7. #7
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    En fait, avec une routine de fichiers, j'ai l'impression que le probl�me vient des String (ou AnsiString) non reconnus par des composants comme ListBox

    Si je remplace les String par des int, cela marche tr�s bien :

    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
     
    struct PERSONNE
     {
      int age;
      int taille;
      int num;
     };
     PERSONNE personnes;
     int pos;
     
    void __fastcall TForm2::EnregistrerStructClick(TObject *Sender)
    {
       // Ecriture
     
      int i;
     
      ofstream fichier ("Repertoire.xyz", ios::out | ios :: app);
     
     
      if(!fichier.is_open())
     
    	cout << "Impossible d'ouvrir le fichier !" << endl;
     
      else
    	{
     
    	  personnes.age = StrToInt(Edit2->Text);
    	  personnes.taille = StrToInt(Edit3->Text);
    	  personnes.num = pos;
    	  pos+=1;
    	  fichier.write ((char *)&personnes, sizeof(PERSONNE));
    	}
     
    	fichier.close();
    }
     
    void __fastcall TForm2::OuvertureStructClick(TObject *Sender)
    {
     ListBox2->Clear();
      int i;
     
     ifstream fichier ("Repertoire.xyz", ios::in );
     
     
      if (!fichier.is_open())
     
    	cout << "Impossible d'ouvrir le fichier en lecture !" << endl;
     
      else
    	 while(fichier.read ((char *)&personnes, sizeof(PERSONNE)))
       {
    	 ListBox2->Items->Add(IntToStr(personnes.age) + " " + IntToStr(personnes.taille)+ " " +IntToStr(personnes.num) );
     
       }
     
      fichier.close();
     }
    De m�me, le code ci-dessous (sans structure) fonctionne avec une variable int n .
    D�s que que la variable est String (ou AnsiString) : plantage

    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
     
    void __fastcall TForm2::EnregistreClick(TObject *Sender)
    {
      int n,p;
     
     
    ofstream sortie("essai.fic", ios::out | ios :: app);
    if (!sortie)
       {
    	ShowMessage ("Création impossible");
    	return;
       }
     
     
       n = StrToInt(Edit4->Text);
      if (n)
    	{
    	 sortie.write ((char *)&n, sizeof(n));
    	}
     
     sortie.close();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::LitClick(TObject *Sender)
    {
    ListBox2->Clear();
      int n;
     
    ifstream entree("essai.fic", ios::in);
    if (!entree)
       {
    	ShowMessage ("lecture impossible");
    	return;
       }
     
     while(entree.read ((char *)&n, sizeof(n)))
     {
      ListBox2->Items->Add(IntToStr(n));
     }
     
     entree.close();
    }

  8. #8
    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
    La vcl contient des classes permettant de s�rialiser simplement diff�rents types de donn�es, de les sauvegarder dans un fichier pour ensuite les relire.
    Jette un coup d��il dans l�aide sur Les Tstream,Treader,Twriter.
    C�est ainsi que on peut sauvegarder facilement des Form en fichier Dfm.
    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

  9. #9
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Merci pour les r�ponses.

    Je vais voir avec TStream

    Cordialement

  10. #10
    Membre exp�riment�
    Homme Profil pro
    D�veloppeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur multiplateformes
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par d�faut
    Bonjour,

    Je pense aussi que TStream est une bonne solution.
    Perso je me suis cr�� une classe "Flux" personnalis�e (� partir des fonctions FileOpen, FileWrite etc.) en surd�finissant les op�rateurs << et >> pour arriver, dans votre exemple, � une �criture du style :
    flux<<personne1<<personne2
    flux>>personne1>>personne2 ...

    Un peu de cuisine au d�part mais beaucoup de temps de gagn� par la suite...

  11. #11
    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
    l'emploi d'une structure de type XML pour ton fichier serait �galement une bonne solution.
    La VCL propose �galement pas mal de solutions (Classes, Helper, Composants, Base de donn�es bas�es XML) etc...
    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

  12. #12
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Merci pour vos r�ponses.

    Il faut que je potasse car je ne suis pas tr�s familier avec TStream et le type XML. (pas d'exemples sur l'aide Embarcadero)

    Yvslms Pouvez-vous me donner plus de pr�cisions sur votre classe "Flux" personnalis�e ?

    Je vais chercher des tutoriels avec des exemples, si vous avez des tuyaux � ce sujet ... merci d'avance.

    (pr�cision que j'ai oubli� de mentionner, j'utilise c++ builder starter)

    Cordialement

  13. #13
    Membre exp�riment�
    Homme Profil pro
    D�veloppeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur multiplateformes
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par d�faut
    Citation Envoy� par magdani Voir le message

    Yvslms Pouvez-vous me donner plus de pr�cisions sur votre classe "Flux" personnalis�e ?

    Cordialement
    Un exp � partir de FileWrite ou FileRead - on peut surd�finir les op�rateurs >> et << au sein de votre class Flux - par exp. pour lire et �crire un entier.
    Pour faire simple et rustique, hdl �tant le handle renvoy� par les fonctions FileOpen ou FileCreate :

    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
    class Flux {
        int hdl;
        ....
    public:
        ...
        friend Flux& operator << (Flux&,int);
        friend Flux& operator >> (Flux&,int&);
    };
     
    Flux& operator << (Flux& f, int n)
    {
    	if(f.hdl>=0)
    		FileWrite(f.hdl,(char*)&n, sizeof(n));
    	return f;
    }
     
    Flux& operator >> (Flux& f, int& n)
    {
    	if(f.hdl>=0) {
    	   int ent;
               FileRead(f.hdl,(char*)&ent, sizeof(ent));
               n=ent;
    	}
    	return f;
    }
    Flux �tant �crite une fois pour toutes pour les principaux types de donn�es le principe est le m�me pour votre classe "personne" :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    friend Flux& operator << (Flux& f, personne& pers);
    friend Flux& operator >> (Flux& f, personne& pers);
     
    Flux& operator << (Flux& f, personne& pers) {
    	f<<pers.nom<<pers.age; //etc.
    	return f;
    }
     
    Flux& operator >> (Flux& f, ressource& rsc) {
    	f>>pers.nom>>pers.age;
    	return f;
    }
    Ce qui permet l'�criture :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    f<<personne1;
    f>>personne1;
    Il y a d'autres fa�ons de faire notamment � partir de TStream.

  14. #14
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Merci pour votre r�ponse yvslms. Je vais �tudier votre code.

  15. #15
    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
    Attention toutefois � un point important une structure a une taille fixe, sauvegarder un pointeur sur un type AnsiString n�a aucun sens.Il vaux mieux cr�er une classe propre avec comme des stream qui eux peuvent avoir des tailles variables.
    Ou alors utilise des tailles fixes comme dans une base de donn�e.
    Il existe des exemples dans l�aide Embarcadero.
    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

  16. #16
    Membre exp�riment�
    Homme Profil pro
    D�veloppeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur multiplateformes
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par d�faut
    J'aurais effectivement du pr�ciser un exp. de code pour les chaines.
    Dans la mesure du possible utiliser de pref. UnicodeString (String).
    Il faut tenir compte du fait qu'Unicode est cod� sur 2 octets/caract�re.
    On enregistre d'abord la taille de la chaine puis les octets correspondants et op�ration inverse � la lecture.

    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
    Flux& operator << (Flux& f, String& str)
    {
    	if(f.hdl>=0) {
    		int dim=str.Length();
    		FileWrite(f.hdl,(char*)&dim,sizeof(dim));
    		FileWrite(f.hdl,(char*)str.c_str(),dim*2);
    	}
     	return f;
    }
     
    Flux& operator >> (Flux& f, String& str)
    {
    	if(f.hdl>=0) {
    		Char *buf;
    		int dim;
    		FileRead(f.hdl,(char*)&dim,sizeof(dim));
    		buf=new Char[dim+1];
    		FileRead(f.hdl,(char*)buf,dim*2);
    		buf[dim]=L'\0';
    		str=buf;
    		delete [] buf;
    	}
    	return f;
    }
    Comme dit plus haut, il a moyen de faire un peu moins bricolage mais cela fonctionne tr�s bien.
    Pour info magdani, la version starter a �t� remplac�e par une version communautaire qui correspond � la version pro compl�te et gratuite y compris le d�veloppement mobile au cas ou vous ne l'utiliseriez pas d�j�.

  17. #17
    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
    La VCL propose des classes toutes faites pour la gestion de ce type de demande.
    classes qui sont des impl�mentations du DotNEt Framework MSDN
    un petit exemple fournit par Embarcadero d'�criture et de lecture dans un fichier facilement adaptable pour traiter d'autre type de donn�es
    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
     
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
    	TStreamWriter* writer;
    	TStreamReader* reader;
    	TCharArray buffer;
     
    	/* Create a writer */
    	writer = new TStreamWriter("local_file.txt", false);
     
    	/* Dump some data in */
    	writer->WriteLine("Hello");
    	writer->WriteLine("World!");
     
    	/* Close the writer */
    	delete writer;
     
    	/* Create a reader */
    	reader = new TStreamReader("local_file.txt");
     
    	/* Prepare a buffer */
    	buffer.set_length(5);
     
    	/* Read first 5 characters */
    	if (reader->ReadBlock(buffer, 0, buffer.Length) < buffer.Length)
    		MessageDlg("Reading failed! Expected to read 5 characters!",
    			mtError, TMsgDlgButtons() << mbOK, 0);
     
    	/* And now, seek the stream back by 5 characters */
    	int byteCount = reader->CurrentEncoding->GetByteCount(buffer);
    	reader->BaseStream->Seek(-1 * byteCount, soFromCurrent);
     
    	/* Reset the internal data buffer, since we modified the stream position */
    	reader->DiscardBufferedData();
     
    	MessageDlg("The original message was:" + reader->ReadLine() +
    		" " + reader->ReadLine(), mtError, TMsgDlgButtons() << mbOK, 0);
     
    	delete reader;
    }
    concernant l'utilisation de XML qui me semble particuli�rement adapt� � ton usage
    un extrait de l'aide Embarcadero ci-dessous
    Afficher : Delphi C++
    Pr�f�rences d'affichageUtilisation de XML dans les applications de bases de donn�esDe RAD Studio
    Remonter � Utilisation de XML dans les applications de bases de donn�es - Index


    En plus de la prise en charge de la connexion � des serveurs de bases de donn�es, Delphi vous permet de travailler avec des documents XML comme s'il s'agissait de serveurs de bases de donn�es. XML (Extensible Markup Language) est un langage de balisage pour la description de donn�es structur�es. Les documents XML fournissent un format standard transportable pour les donn�es, qui est utilis� dans les applications Web, la communication inter-entreprises (business-to-business), etc. Pour plus d'informations sur la manipulation directe de documents XML avec Delphi, voir Utilisation de documents XML.

    La prise en charge des documents XML pour les applications de bases de donn�es repose sur un ensemble de composants capables de convertir des paquets de donn�es (la propri�t� Data d'un ensemble de donn�es client) en documents XML et des documents XML en paquets de donn�es. Pour utiliser ces composants, vous devez tout d'abord d�finir la transformation entre le document XML et le paquet de donn�es. Apr�s avoir d�fini la transformation, vous pouvez utiliser des composants sp�ciaux pour :

    Convertir des documents XML en paquets de donn�es.
    Fournir des donn�es d'un document XML et traiter les mises � jour d'un document XML.
    Utiliser un document XML comme client d'un fournisseur.
    Voir aussiConception d'applications de base de donn�es - Pr�sentation
    Utilisation de documents XML
    Compr�hension des ensembles de donn�es - Pr�sentation
    Utilisation de contr�les de donn�es
    Manipulation des composants champ - Pr�sentation
    Utilisation d'ensembles de donn�es client - Pr�sentation
    Utilisation des composants ADO
    Utilisation des ensembles de donn�es dbExpress
    Utilisation du moteur de base de donn�es Borland
    Utilisation des composants fournisseur
    Cr�ation d'applications multiniveaux - Pr�sentation
    Cat�gories : Guide du d�veloppeur WindowsDelphiC++Envoyer mon commentaire (ANSI)Copyright (C) 2019 Embarcadero Technologies, Inc. Tous droits r�serv�s.Page Wiki en cours
    cdlt
    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

  18. #18
    Membre exp�riment�
    Homme Profil pro
    D�veloppeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    277
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : D�veloppeur multiplateformes
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 277
    Par d�faut
    Citation Envoy� par DjmSoftware Voir le message
    Salut
    La VCL propose des classes toutes faites pour la gestion de ce type de demande....
    On est bien d'accord pour XML, mais pour le reste on est encore sur des fonctions de relativement bas niveau....
    Quelque soit la m�thode il faut aussi v�rifier que cela fonctionne en multiplateforme sur FMX - incontournable aujourd'hui.

    Cdl

  19. #19
    Membre confirm�
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    132
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 132
    Par d�faut
    Il y a �galement un exemple avec StreamCharRdWr (C++) sur l'aide Embarcadero

    Cordialement

Discussions similaires

  1. Lecture fichier binaire avec structure connue
    Par sdecorme dans le forum Scilab
    R�ponses: 1
    Dernier message: 08/12/2016, 13h25
  2. Lecture/�criture fichier binaire via structure
    Par Tenebrous dans le forum C
    R�ponses: 9
    Dernier message: 07/03/2010, 00h02
  3. R�ponses: 9
    Dernier message: 04/06/2007, 21h44
  4. R�ponses: 5
    Dernier message: 26/03/2007, 01h30

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