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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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 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
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    Par défaut
    Merci pour les réponses.

    Je vais voir avec TStream

    Cordialement

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    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 : 273
    Points : 628
    Points
    628
    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 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
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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 confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    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 : 273
    Points : 628
    Points
    628
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    Par défaut
    Merci pour votre réponse yvslms. Je vais étudier votre code.

  15. #15
    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
    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 confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    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 : 273
    Points : 628
    Points
    628
    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 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
    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 confirmé
    Homme Profil pro
    Développeur multiplateformes
    Inscrit en
    Mars 2003
    Messages
    273
    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 : 273
    Points : 628
    Points
    628
    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 du Club
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 130
    Points : 59
    Points
    59
    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